无法使用 keyof 分配给字段
Can't use keyof to assign to a field
我想对我遇到的这个错误进行一些解释:
interface Test {
a: number;
b: string;
c: string;
}
function f(obj1: Test, obj2: Test, field: keyof Test) {
obj1[field] = obj2[field]; // Error: Type 'string | number' is not assignable to type 'never'.
}
以下是我发现的一些避免该错误的方法:
- 如果测试仅包含数字或仅包含字符串
- 如果我使用
obj1[field as string] = obj2[field]
- 如果我将方法更改为
function f<K extends keyof Test>(obj1: Test, obj2: Test, field: K)
但我不明白为什么这段代码会失败,是打字稿中的“错误”还是我遗漏了什么?
那是因为 TypeScript 不知道 obj2[field]
将返回什么类型。它可以是 number
或 string
。此外,TypeScript 不知道 obj1[field]
是什么类型。因为它是 number | string
所以它决定,为了类型安全,它将是 never
,因为没有类型是 number
和 string
的基础。此外,TypeScript 不知道哪个 属性 名称将出现在 field
中
if Test contains only numbers or only strings
在那种情况下,TypeScript 肯定知道所有字段都是 number
或 string
,因此它可以推断 obj1[field]
和 obj2[field]
的类型,并且它将是同一类型。
if I change my method to function f(obj1: Test, obj2: Test, field: K)
在那种情况下,TypeScript 准确地知道 obj1[field]
和 obj2[field]
的类型,因此它可以安全地分配值。
我想对我遇到的这个错误进行一些解释:
interface Test {
a: number;
b: string;
c: string;
}
function f(obj1: Test, obj2: Test, field: keyof Test) {
obj1[field] = obj2[field]; // Error: Type 'string | number' is not assignable to type 'never'.
}
以下是我发现的一些避免该错误的方法:
- 如果测试仅包含数字或仅包含字符串
- 如果我使用
obj1[field as string] = obj2[field]
- 如果我将方法更改为
function f<K extends keyof Test>(obj1: Test, obj2: Test, field: K)
但我不明白为什么这段代码会失败,是打字稿中的“错误”还是我遗漏了什么?
那是因为 TypeScript 不知道 obj2[field]
将返回什么类型。它可以是 number
或 string
。此外,TypeScript 不知道 obj1[field]
是什么类型。因为它是 number | string
所以它决定,为了类型安全,它将是 never
,因为没有类型是 number
和 string
的基础。此外,TypeScript 不知道哪个 属性 名称将出现在 field
if Test contains only numbers or only strings
在那种情况下,TypeScript 肯定知道所有字段都是 number
或 string
,因此它可以推断 obj1[field]
和 obj2[field]
的类型,并且它将是同一类型。
if I change my method to function f(obj1: Test, obj2: Test, field: K)
在那种情况下,TypeScript 准确地知道 obj1[field]
和 obj2[field]
的类型,因此它可以安全地分配值。