如何在TypeScript中通过值获取const enum对应的枚举成员
问题原因
const enum 是 TypeScript 的编译期优化特性,默认情况下编译后会被完全内联到使用位置,运行时不存在对应的枚举对象,因此你原有的代码会出现两类错误:
- 将
MyEnum1作为参数传入函数时,运行时无对应的枚举对象可传递 - 使用
MyEnum1[enumKey]这种动态索引访问写法会被 TypeScript 拦截,const enum 默认不支持动态索引访问
可选解决方案
方案1:保留const enum特性,手动维护映射表
如果需要保留const enum无额外运行时代码的优势,可以单独声明一个和const enum完全匹配的运行时映射对象:
const enum MyEnum1 { ORANGE = 'orange', YELLOW = 'yellow' } // 映射表和MyEnum1成员完全对齐,as const保证类型推导正确 const MyEnum1ValueMap = { [MyEnum1.ORANGE]: MyEnum1.ORANGE, [MyEnum1.YELLOW]: MyEnum1.YELLOW } as const; enum MyEnum2 { ORANGE = 'orange', BLACK = 'black', YELLOW = 'yellow', } function converter(type2: MyEnum2): MyEnum1 { const matchedValue = MyEnum1ValueMap[type2 as keyof typeof MyEnum1ValueMap]; if (!matchedValue) { throw new Error('Key does not exist'); } return matchedValue; }
方案2:开启编译选项保留const enum运行时代码
如果不想手动维护映射表,可以在tsconfig.json中开启preserveConstEnums编译选项,开启后TypeScript会为const enum也生成运行时枚举对象,原有代码只需补充类型断言即可运行:
// 原有其他代码不变,仅修改converter函数逻辑即可 function converter(type2: MyEnum2): MyEnum1 { const enumKey = getEnumKeyByEnumValue(MyEnum1 as unknown as Record<string, string>, type2); if (!enumKey) { throw new Error('Key does not exist'); } return MyEnum1[enumKey as keyof typeof MyEnum1]; }
该方案的缺点是会失去const enum的编译优化效果,运行时表现和普通enum一致。
方案3:直接移除const修饰符
如果你的业务场景不需要const enum的优化特性,直接将const enum MyEnum1改为普通enum MyEnum1,再补充上述类型断言,原有逻辑即可直接运行。
内容的提问来源于stack exchange,提问作者Noy Oliel
相关产品推荐
相关产品推荐

