我有一个不带对象的函数,我想输出它们的合并版本:
export function merge(...objects: any[]) {
return objects.reduce((acc, current) => {
acc = {
...acc,
...current
}
return acc;
}, {});
}
const a = { name: '' };
const b = { id: 1 };
const c = { prop: '' };
const result = merge(a, b, c);
如何根据传递的对象自动推断result
变量的类型?
答案 0 :(得分:5)
objects
数组组件类型是各个对象类型的并集,您的结果就像一个交集,因此这是一个使用this answer的并集到交集转换的解决方案。 / p>
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
type Merge<A extends any[]> = UnionToIntersection<A[number]>
用法:
function merge<A extends any[]>(...objects: A): Merge<A> {
// ...
}
const result = merge({ a: 1 }, { b: 'foo' }, { c: 2, d: 'bar' });
// result: { a: number } & { b: string } & { c: number, d: string }
结果实际上与{ a: number, b: string, c: number, d: string }
等效,但是不幸的是Typescript并不能简化它。