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

如何实现类Object.assign逻辑的TypeScript接口合并工具类型?

实现类似Object.assign逻辑的联合类型合并工具类型

可以通过递归条件类型模拟数组reduce的逻辑,实现将联合类型中的多个接口按Object.assign的规则合并(后出现的类型覆盖先出现的重复属性)。以下是完整实现:

// 合并两个类型:用后一个类型覆盖前一个的重复属性
type MergeTwo<S, T> = Omit<S, keyof T> & T;

// 递归合并联合类型中的所有成员,模拟reduce累积合并
type MergeTypes<U, Acc = {}> = 
  U extends infer Current 
    ? MergeTypes<Exclude<U, Current>, MergeTwo<Acc, Current>> 
    : Acc;

代码说明

  1. MergeTwo<S, T>:基础合并逻辑,通过Omit<S, keyof T>剔除前一个类型S中与后一个类型T重复的属性,再与T交叉,确保T的属性完全覆盖S的重复属性,和Object.assign(S, T)的类型行为一致。
  2. MergeTypes<U, Acc = {}>:
    • 利用TypeScript的分布式条件类型,将联合类型U拆分为单个成员Current;
    • 递归处理剩余的联合类型(Exclude<U, Current>),同时将当前累积结果Acc与Current合并,更新累积值;
    • 当所有联合成员处理完毕(U变为never),返回最终的累积合并结果。

测试示例

type A = {a: number};
type B = {a: boolean, b: boolean};
type C = {c: boolean};

type MergedType = MergeTypes<A|B|C>;
// 最终结果:{ a: boolean; b: boolean; c: boolean }

这个实现完全符合你需要的Object.assign式覆盖逻辑,重复属性不会变为never,而是被后续类型的属性覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:30:04