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

und*_*ned 2 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);
Run Code Online (Sandbox Code Playgroud)

如何result根据传递的对象自动推断变量的类型?

kay*_*ya3 5

objects阵列组件类型是个体对象类型的结合,和你的结果是一样的交点,所以在这里是使用从联盟到交叉点转化的溶液此答案

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]>
Run Code Online (Sandbox Code Playgroud)

用法:

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 }
Run Code Online (Sandbox Code Playgroud)

结果实际上等同于{ a: number, b: string, c: number, d: string }但不幸的是 Typescript 并没有简化它。

游乐场链接