Typescript 为什么可以';t类型脚本在赋值中使用泛型类型的键,并将其泛化为字符串?

Typescript 为什么可以';t类型脚本在赋值中使用泛型类型的键,并将其泛化为字符串?,typescript,generics,keyof,Typescript,Generics,Keyof,我遇到了一个奇怪的Typescript分配错误,我正试图进一步了解它为什么不起作用。作为参考,我使用TS3.9.2 守则: function test<U extends object>(a: U, k: keyof U) { const x: Partial<U> = { [k]: a[k] }; // ... } 功能测试(a:U,k:keyof U){ 常数x:Partial={[k]:a[k]}; // ... } 错误: Type '{ [

我遇到了一个奇怪的Typescript分配错误,我正试图进一步了解它为什么不起作用。作为参考,我使用TS
3.9.2

守则:

function test<U extends object>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] };
    // ...
}

功能测试(a:U,k:keyof U){
常数x:Partial={[k]:a[k]};
// ...
}
错误:

Type '{ [x: string]: U[keyof U]; }' is not assignable to type 'Partial<U>'.
类型“{[x:string]:U[keyof U];}”不可分配给类型“Partial”。
这个问题只有在我使用泛型时才会出现,例如,如果我使用的不是
U
,而是一个具体的接口,那么它就会按预期工作

我假设中的类型系统无法正确推断
U
的键并在赋值过程中使用它们,这是为什么?我在
{[k]:a[k]}
中检查
k
的类型,它正确地返回
keyof U
,因此我不完全理解为什么类型系统不能使用该信息来检查赋值是否合法,并将
k
概括为
字符串


谢谢。

我认为,唯一的原因是,它不起作用,typescript没有完全理解您的意图,因为您创建了一个新对象,并且没有关于它的信息

在这种情况下,最好告诉编译器,现在您有了原始对象的一部分

function test<U>(a: U, k: keyof U) {
    const x: Partial<U> = { [k]: a[k] } as Partial<U>;

    return x;
}
功能测试(a:U,k:keyof U){
常数x:Partial={[k]:a[k]}作为Partial;
返回x;
}

它将工作

我同意,这将如预期的那样工作,但我想更好地理解为什么它与具体的接口一起工作,而与泛型不一起工作。