Typescript编译器永远不会错误:键入'string |数字”不能分配给“从不”类型。类型'string'不能分配给类型'never'

问题描述 投票:1回答:1

这是我得到的一段代码:

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)

这里是屏幕截图:

error message

这里发生了一件奇怪的事情,如果您将鼠标悬停在变量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] = ...

typescript generics types
1个回答
1
投票

关于错误,那是因为keyof Obj可能是类型为"a""b"numberstring。在表达式obj[key]中,编译器不知道属性类型,它也可能是numberstring,因此它不允许这种分配。 Here是相同的问题。您可以找到说明here,请参见修复对索引访问类型的不正确写入

© www.soinside.com 2019 - 2024. All rights reserved.