如何为合并对象数组的函数正确推断返回类型?
TypeScript 合并数组对象的返回类型自动推断
你当前的mergeArray函数因泛型约束和返回类型处理的问题,无法自动推断出合并后的具体对象类型,返回值被推断为{}。要实现预期的类型推断,可通过自定义工具类型和调整泛型约束解决:
修改后的完整代码
// 工具类型:合并数组中所有对象类型的交叉类型 type Merge<T extends readonly Record<string, any>[]> = T[number] extends infer U ? U extends Record<string, any> ? { [K in keyof U]: U[K] } : never : never; function mergeArray<T extends readonly Record<string, any>[]>(f: T): Merge<T> { return f.reduce((acc, curr) => { return { ...acc, ...curr, }; }, {} as Merge<T>); } const e = mergeArray([{ foo: 1 }, { bar: "test" }, { baz: true }]); // e的类型自动推断为:{ foo: number; bar: "test"; baz: boolean; }
关键说明
- Merge工具类型:
- 通过
T[number]获取数组元素的联合类型,再利用条件类型将联合类型交叉合并为单个对象类型,准确保留每个属性的原始类型。
- 通过
- 泛型约束调整:
- 将泛型约束改为
T extends readonly Record<string, any>[],让TypeScript能推断出数组的元组类型(而非宽泛的数组类型),从而保留每个元素对象的具体结构信息。
- 将泛型约束改为
- 初始值类型断言:
- 在
reduce的初始值{}后添加as Merge<T>,确保累加器类型与最终返回类型一致,避免TypeScript将其推断为{}。
- 在
若数组中存在重复键,后面的对象属性会覆盖前面的,TypeScript也会自动推断为最后出现的属性类型,符合JavaScript展开运算符的行为。
内容的提问来源于stack exchange,提问作者Quadear
相关产品推荐
相关产品推荐

