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

如何在TypeScript中从任意数量的小对象构造对象类型?

在TypeScript中实现合并多对象参数的函数

完全可以实现你要的效果,以下是具体方案:

首先我们需要一个工具类型把联合类型转成交叉类型,用来合并多个对象的类型:

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

然后定义foo函数,利用泛型捕获所有参数的类型,并返回交叉后的合并类型:

function foo<T extends object[]>(...args: T): UnionToIntersection<T[number]> {
  return args.reduce((acc, curr) => ({ ...acc, ...curr }), {} as UnionToIntersection<T[number]>);
}

使用示例

调用方式和你要求的完全一致:

const result = foo(
  { key1: 'hello' },
  { key2: 5 },
  { key3: true },
);

此时result的类型会被推导为:

{
  key1: string;
  key2: number;
  key3: boolean;
}

原理说明

  • 泛型T会捕获所有传入的对象参数的类型数组,T[number]得到这些对象类型的联合
  • UnionToIntersection工具类型将联合类型转换为交叉类型,多个单键对象的交叉类型在TypeScript中会被自动合并为包含所有键的单一对象类型
  • 函数内部通过reduce方法将传入的对象逐个合并,类型断言确保返回值符合推导的类型

这个实现支持任意数量的对象参数,哪怕参数包含多键对象也能正常合并类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:01:55