我有这个函数有几个签名重载。
// 1: overwrite
function extend<T>(d: T, ...s: Partial<T>[]): T;
// 2: shallow copy & overwrite
function extend<T>(o: {}, d: T, ...s: Partial<T>[]): T;
// 3: overwrite & extend
function extend<T, S extends T>(d: T, ...s: Partial<S>[]): Partial<S>;
// 4: shallow copy & overwrite & extend
function extend<T, S extends T>(o: {}, d: T, ...s: Partial<S>[]): Partial<S>;
// implementation
function extend(d: any, ...s: any[]): any {
for (let src of s) {
for (let prop in src) {
if (src.hasOwnProperty(prop)) {
d[prop] = src[prop];
}
}
}
return d;
}
为了使开发更容易,我希望通过类型推断来完成所有这些代码的完成。
签名1一个完美无瑕。支持类型推断,当我开始键入s
个对象的属性时,我得到代码完成。
我也理解签名3和4不可能进行类型推断,因为S
类型无法从任何地方推断,特别是因为参数类型为Partial<S>
。
但我不确定签名2 。似乎应该可以基于第二个参数推断S
的类型,除非我明确提供泛型类型参数,否则不是这种情况。
如何同时完成1和2的类型推断(和代码完成)?或者为什么它不可能?我看到的部分问题是我不知道如何为空对象文字制作类型别名。因为我认为这将是签名2的解决方案。