我遇到了一个奇怪的 Typescript 赋值错误,我想更多地了解它为什么不起作用。作为引用,我使用的是 TS 3.9.2
。
代码:
function test<U extends object>(a: U, k: keyof U) {
const x: Partial<U> = { [k]: a[k] };
// ...
}
错误:
Type '{ [x: string]: U[keyof U]; }' is not assignable to type 'Partial<U>'.
问题仅在我使用泛型时出现,例如,如果我使用具体接口(interface)而不是 U
,那么它会按预期工作。
我假设类型系统无法正确推断 U
的键并在赋值期间使用它们,这是为什么?我在 { [k]: a[k] }
中检查了 k
的类型,它正确地返回了 keyof U
所以我不完全理解为什么类型系统不能使用该信息来检查分配是否合法并将 k
泛化为 string
。
谢谢。
最佳答案
我认为,它不起作用的唯一原因是 typescript 没有完全理解您的意图,因为您创建了一个新对象,但没有关于它的信息。
在这种情况下最好告诉编译器,现在你有原始对象的一部分
function test<U>(a: U, k: keyof U) {
const x: Partial<U> = { [k]: a[k] } as Partial<U>;
return x;
}
它会起作用
关于typescript - 为什么 Typescript 不能在赋值中使用泛型的 keyof 类型并将其泛化为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200001/