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

如何合并含同名枚举的两个对象类型(避免结果为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:50:39