泛型类型上的keyof运算符的行为的解释

时间:2019-03-07 14:01:28

标签: typescript generics

我偶然发现了一个小问题,实际上我设法解决了。但是,我正在寻找一个解释,为什么这首先是一个问题。

可以说我们有以下几种类型:

interface Base {
    name: string;
}

interface TypeA extends Base {
    foo: number;
} 

interface TypeB extends Base {
    bar: string;
}

我们有以下通用函数:

const genericSet = <T>(obj: T, partial: Partial<T>) => ({ ...obj, ...partial });
const demo = genericSet({ b: '222', a: 111 }, { a: 333 });
/* works great */

但是现在让我们从另一个通用函数中调用该函数:

function doSomething<T extends Base>(obj: T) {
    const newObj = genericSet(obj, { name: 'a' }); //error!, argument {name: string} isn't assignable to Partial<T>
   ...
}

但是,如果我们这样定义函数,基本上就是重写Partial

const genericSet2 = <T, K extends keyof T>(obj: T, partial:{[key in K]?: T[key]} ) => ({ ...obj, ...partial });

比一切正常!

我只是在寻找原因。凭直觉我可以猜测到typescript实际计算类型时,这是相关的,但是我想具体说明为什么它起作用(如果没有别的,只是我对实际术语很熟悉)

如果您知道任何相关的github问题/提交,那也很好。

0 个答案:

没有答案