You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

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; }

关键说明

  1. Merge工具类型:
    • 通过T[number]获取数组元素的联合类型,再利用条件类型将联合类型交叉合并为单个对象类型,准确保留每个属性的原始类型。
  2. 泛型约束调整:
    • 将泛型约束改为T extends readonly Record<string, any>[],让TypeScript能推断出数组的元组类型(而非宽泛的数组类型),从而保留每个元素对象的具体结构信息。
  3. 初始值类型断言:
    • 在reduce的初始值{}后添加as Merge<T>,确保累加器类型与最终返回类型一致,避免TypeScript将其推断为{}。

若数组中存在重复键,后面的对象属性会覆盖前面的,TypeScript也会自动推断为最后出现的属性类型,符合JavaScript展开运算符的行为。

内容的提问来源于stack exchange,提问作者Quadear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:12:52