0

我想对我遇到的这个错误做一些解释:

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'.
}

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

  • 如果 Test 仅包含数字或仅包含字符串
  • 如果我使用obj1[field as string] = obj2[field]
  • 如果我将方法更改为function f<K extends keyof Test>(obj1: Test, obj2: Test, field: K)

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

4

1 回答 1

1

那是因为 TypeScript 不知道obj2[field]. 它可以是numberstring。此外,TypeScript 不知道obj1[field]将是什么类型。并且因为它是number | string这样,为了类型安全,它决定它将是never,因为没有类型可以同时用于numberstring。此外,TypeScript 不知道哪个属性名称将在field

如果 Test 仅包含数字或仅包含字符串

在这种情况下,TypeScript 肯定知道所有字段都是numberor string,因此它可以推断出 and 的类型obj1[field]obj2[field]并且它们将是相同的类型。

如果我将方法更改为函数 f(obj1: Test, obj2: Test, field: K)

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

于 2021-12-19T16:09:56.253 回答