在TypeScript中如何不区分大小写地索引枚举对象?
如何通过枚举值索引TypeScript枚举对象
在TypeScript中,字符串枚举默认仅生成键到值的单向映射,不会自动创建反向的值到键/枚举成员映射,因此直接用枚举值索引原枚举对象会失败。你不需要强制让枚举值与键完全匹配,也不用手动处理字符串去适配键的格式,有更合理的实现方式:
解决方案1:手动创建反向映射对象
如果枚举规模不大,可直接手动定义反向映射对象,将枚举值映射回对应的枚举成员:
declare enum MyEnum { PRODUCTION = "production", DEVELOPMENT = "development", SANDBOX = "sandbox" } // 手动构建值到枚举成员的映射 const MyEnumByValue = { production: MyEnum.PRODUCTION, development: MyEnum.DEVELOPMENT, sandbox: MyEnum.SANDBOX } as const; // 直接用枚举值索引获取对应成员 const lowercase = "production"; const validEnumMember = MyEnumByValue[lowercase]; // 类型为MyEnum.PRODUCTION
解决方案2:通用反向映射工具函数
若枚举成员较多,手动编写映射过于繁琐,可通过通用函数自动生成反向映射:
declare enum MyEnum { PRODUCTION = "production", DEVELOPMENT = "development", SANDBOX = "sandbox" } // 自动生成枚举值到枚举成员的映射 function createEnumValueMap<T extends Record<string, string>>(enumObj: T) { const map: Record<T[keyof T], T[keyof T]> = {} as any; for (const key in enumObj) { const value = enumObj[key]; map[value] = value; } return map; } const MyEnumByValue = createEnumValueMap(MyEnum); const result = MyEnumByValue["production"]; // 类型为MyEnum.PRODUCTION
解决方案3:遍历枚举查找匹配值
如果不需要预先创建映射,也可直接遍历枚举值找到匹配的成员:
declare enum MyEnum { PRODUCTION = "production", DEVELOPMENT = "development", SANDBOX = "sandbox" } // 通过遍历获取与值匹配的枚举成员 function getEnumMemberByValue(value: string): MyEnum | undefined { return Object.values(MyEnum).find(v => v === value) as MyEnum | undefined; } const lowercase = "production"; const validEnumMember = getEnumMemberByValue(lowercase); // 类型为MyEnum.PRODUCTION | undefined
额外说明
- TypeScript的数字枚举会自动生成反向映射,但字符串枚举不会,这是两者的核心差异。
- 若硬要通过原枚举对象索引,也可将输入字符串转为键的格式(比如
lowercase.toUpperCase()),但这种方式依赖键的命名规则,一旦规则变更就会失效,远不如反向映射可靠。
内容的提问来源于stack exchange,提问作者bombillazo
相关产品推荐
相关产品推荐

