无法使用 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'.
}

以下是我发现的一些避免该错误的方法:

但我不明白为什么这段代码会失败,是打字稿中的“错误”还是我遗漏了什么?

那是因为 TypeScript 不知道 obj2[field] 将返回什么类型。它可以是 numberstring。此外,TypeScript 不知道 obj1[field] 是什么类型。因为它是 number | string 所以它决定,为了类型安全,它将是 never,因为没有类型是 numberstring 的基础。此外,TypeScript 不知道哪个 属性 名称将出现在 field

if Test contains only numbers or only strings

在那种情况下,TypeScript 肯定知道所有字段都是 numberstring,因此它可以推断 obj1[field]obj2[field] 的类型,并且它将是同一类型。

if I change my method to function f(obj1: Test, obj2: Test, field: K)

在那种情况下,TypeScript 准确地知道 obj1[field]obj2[field] 的类型,因此它可以安全地分配值。