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

TypeScript:如何正确合并存在重叠项的两个枚举?

合并存在重复键值的TypeScript枚举的正确方式

先看给出的两个枚举:

enum MyFirstEnum {
  A = 'A',
  B = 'B',
  C = 'C'
}

enum MySecondEnum {
  C = 'C',
  D = 'D',
  E = 'E'
}

它们都包含C = 'C'的成员,直接用MyFirstEnum | MySecondEnum做联合类型会触发类型错误,比如你遇到的场景:

type BothEnums = MyFirstEnum | MySecondEnum

const myRecord: Partial<Record<BothEnums, string>> = {}
const someKey = MyFirstEnum.C

myRecord[someKey] = 'some value' // ❌ 类型报错:属性不存在

这是因为TypeScript会把两个枚举里的C视为不同的类型成员,即使它们的值完全一致。下面是几种可行的解决办法:

方法1:转成字符串字面量类型

把枚举成员转成对应的字符串字面量,重复的值会被自动合并,不会产生类型冲突:

// 将枚举转为字符串字面量类型集合
type FirstEnumValues = `${MyFirstEnum}`;
type SecondEnumValues = `${MySecondEnum}`;
// 合并后的字面量类型,自动去重重复值
type MergedEnumValues = FirstEnumValues | SecondEnumValues;

// 用合并后的类型定义Record
const myRecord: Partial<Record<MergedEnumValues, string>> = {};
const someKey = MyFirstEnum.C;

myRecord[someKey] = 'some value'; // ✅ 正常工作

这种方式不需要修改原有枚举,同时能让类型系统正确识别所有合法键。

方法2:手动创建合并后的新枚举

如果可以重构代码,直接新建一个包含所有成员的枚举是最直观的方案:

enum MergedEnum {
  A = 'A',
  B = 'B',
  C = 'C',
  D = 'D',
  E = 'E'
}

// 直接使用新枚举
const myRecord: Partial<Record<MergedEnum, string>> = {};
const someKey = MergedEnum.C;

myRecord[someKey] = 'some value'; // ✅ 无类型问题

彻底避免了枚举之间的冲突,代码可读性也更高。

方法3:类型断言(临时应急,不推荐)

如果没办法修改原有枚举,也不想转字面量,万不得已可以用类型断言跳过检查:

type BothEnums = MyFirstEnum | MySecondEnum;

const myRecord: Partial<Record<BothEnums, string>> = {};
const someKey = MyFirstEnum.C;

// 通过断言绕过类型检查
(myRecord[someKey as BothEnums] as string) = 'some value'; // ✅ 可运行但损失类型安全

这种方式会关闭部分类型校验,可能隐藏潜在问题,只适合临时场景使用。

总结

优先推荐前两种方法:转字符串字面量类型适合保留原有枚举结构的场景;手动合并枚举适合可以重构代码的场景,能彻底解决类型冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:55:19