对象未知合并的打字稿返回类型

时间:2020-08-09 11:33:19

标签: typescript

我有一个不带对象的函数,我想输出它们的合并版本:

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变量的类型?

1 个答案:

答案 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并不能简化它。

Playground Link