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

如何在TypeScript中通过值获取const enum对应的枚举成员

问题原因

const enum 是 TypeScript 的编译期优化特性,默认情况下编译后会被完全内联到使用位置,运行时不存在对应的枚举对象,因此你原有的代码会出现两类错误:

  1. 将 MyEnum1 作为参数传入函数时,运行时无对应的枚举对象可传递
  2. 使用 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:45:02