如何正确推断合并对象数组的类型?

问题描述 投票:0回答:1

我有以下功能:

function mergeArray<T extends Array<Record<string, any>>>(f: T) {
  return f.reduce((acc, curr) => {
    return {
      ...acc,
      ...curr,
    };
  }, {});
}

const e = mergeArray([{ foo: 1 }, { bar: "test" }, { baz: true }]);
// expected e type is { foo: number; bar: "test"; baz: boolean; }

如何编写转换函数的返回类型以便推断类型?

typescript
1个回答
0
投票

您可以编写自己的自定义返回类型:

type Union<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;

function mergeArray<T extends Array<Record<string, any>>>(f: T): Union<T[number]> {
  return f.reduce((acc, curr) => {
    return {
      ...acc,
      ...curr,
    };
  }, {}) as Union<T[number]>;
}

const e = mergeArray([{ foo: 1 }, { bar: "test" }, { baz: true }]);
© www.soinside.com 2019 - 2024. All rights reserved.