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
相关产品推荐
相关产品推荐

