如何实现类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;
代码说明
MergeTwo<S, T>:基础合并逻辑,通过Omit<S, keyof T>剔除前一个类型S中与后一个类型T重复的属性,再与T交叉,确保T的属性完全覆盖S的重复属性,和Object.assign(S, T)的类型行为一致。MergeTypes<U, Acc = {}>:- 利用TypeScript的分布式条件类型,将联合类型
U拆分为单个成员Current; - 递归处理剩余的联合类型(
Exclude<U, Current>),同时将当前累积结果Acc与Current合并,更新累积值; - 当所有联合成员处理完毕(
U变为never),返回最终的累积合并结果。
- 利用TypeScript的分布式条件类型,将联合类型
测试示例
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
相关产品推荐
相关产品推荐

