如何合并含同名枚举的两个对象类型(避免结果为never)
合并含同名枚举值的不同枚举对应的对象类型
当两个枚举名称不同但包含同名枚举值时,直接用交叉类型&合并对象类型会得到never——这是因为TypeScript将不同的枚举视为完全独立的类型,哪怕枚举值的字面量完全相同,e1 & e2的结果也是never,进而导致整个交叉类型变为never。
要实现期望的合并效果(冲突属性取联合类型,其他属性保留),可以自定义一个合并类型工具:
enum e1 { bo = 'bo', } enum e2 { bo = 'bo', } type a1 = { a: e1 b: number } type a2 = { a: e2 c: string } // 自定义合并类型工具 type Merge<T, U> = { [K in keyof T | keyof U]: K extends keyof T & keyof U ? T[K] | U[K] : K extends keyof T ? T[K] : U[K] } // 得到期望的类型 type a12 = Merge<a1, a2> // 最终类型:{ a: e1 | e2; b: number; c: string }
这个Merge类型会遍历两个输入类型的所有属性键:
- 如果是两个类型共有的键,就将属性类型设为两个类型的联合
- 如果是其中一个类型独有的键,直接保留原类型
通过这种方式就能得到符合预期的合并对象类型。
内容的提问来源于stack exchange,提问作者Stav Alfi
相关产品推荐
相关产品推荐

