我有以下功能:
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; }
如何编写转换函数的返回类型以便推断类型?
您可以编写自己的自定义返回类型:
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 }]);