这是我得到的一段代码:
interface Obj {
a: number
b: string
}
const obj: Obj = {
a: 1,
b: 'hi'
}
function fn(key: keyof Obj, value: Obj[keyof Obj]) {
let foo = obj[key]
obj[key] = value
}
fn("a", 2)
所以我想做的是,我希望函数fn()
能够更新对象obj
的属性,该函数的第一个参数是obj
拥有的任何键(在Obj
接口中定义),第二个参数是您想要为该键提供的值。
但是,在obj[key] = value
此行中出现带错误的打字稿,这是:
Type 'string | number' is not assignable to type 'never'.
Type 'string' is not assignable to type 'never'.(2322)
这里是屏幕截图:
这里发生了一件奇怪的事情,如果您将鼠标悬停在变量foo
(在图片中的第13行,它说:]]
let foo: string | number
这表示
obj[key]
的类型为string | number
,但错误显示obj[key]
的类型为never
。
所以我的第一个问题是:
string | number
类型如何神奇地变成永不类型?有什么办法可以解决这个问题?然后我又得到了解决该问题的一段代码:
interface Obj { a: number b: string } const obj: Obj = { a: 1, b: 'hi' } function fn<K extends keyof Obj>(key: K, value: Obj[K]) { obj[key] = value } fn("a", 2)
因此,我的第二个问题是:为什么使用
Generics
解决问题,这里的关键字extends
是什么hack?
BTW,所有代码均以打字稿3.7.5
版本进行测试。
我不是英语母语人士,希望我能清楚地解释我的困惑。
[这是我得到的一段代码:接口Obj {a:数字b:字符串} const obj:Obj = {a:1,b:'hi'}函数fn(key:keyof Obj,value:Obj [keyof Obj]){let foo = obj [key] obj [key] = ...