function addType<E extends object>(obj: any): // inferred object type + E {
// Implementation
}
const x = addType<{ extraProp: number }>({ someProp: 1 });
// The type of x should be:
// {
// someProp: number;
// extraProp: number;
// }
目标是让 TypeScript 推断 obj 参数的类型(在本例中为 { someProp: number } ),然后将其与泛型类型合并 { extraProp: number } ,以便得到的类型为:
{
someProp: number;
extraProp: number;
}
但是,我希望通过仅提供一个类型参数(而不是两个)来实现这一点 { extraProp: number } 。我希望函数 obj 自动推断参数的类型。
function addType<T extends object>(obj: T) {
return {
...obj,
extraProp: 1
}
}
const x = addType({ someProp: 1 });
console.log(
x.extraProp, // OK
x.someProp // OK
);
如果您想在运行时合并对象,您可以使用以下命令:
function mergeFactory<T extends object> (extra: T) {
return <T extends object> (obj: T) => {
return {
...obj,
...extra
}
}
}
// Create a new function
const addType = mergeFactory({ extraProp: 1 });
// Use the new function
const x = addType({ someProp: 1 });
console.log(
x.extraProp, // OK
x.someProp // OK
);
游乐场演示
要合并类型,您可以使用 & :
type Extra = { extraProp: number };
type Base = { someProp: number };
type Merge = Extra & Base;
// You can also use generics but is an overkill
type GenericMerge<T1, T2> = T1 & T2;
type Merge2 = GenericMerge<Extra, Base>;