我偶然发现了一个小问题,实际上我设法解决了。但是,我正在寻找一个解释,为什么这首先是一个问题。
可以说我们有以下几种类型:
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问题/提交,那也很好。