【发布时间】:2020-01-31 09:08:40
【问题描述】:
这是我得到的一段代码:
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这一行出现错误的typescript弹窗,即:
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类型为什么会神奇地变成 never 类型?有没有办法解决这个问题?
然后我得到了另一个解决这个问题的代码:
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是什么?
顺便说一句,所有代码都在 typescript 3.7.5 版本中测试。
我不是以英语为母语的人,希望我能清楚地解释我的困惑。
【问题讨论】:
标签: typescript generics types