TypeScript中如何将整数值映射到字符串枚举?转换返回undefined问题求助
TypeScript中整数映射字符串枚举的问题解决方法
这个问题我之前也碰到过!你踩的坑其实是TypeScript字符串枚举和数字枚举的核心区别——字符串枚举不会自动生成反向映射,所以直接用MyEnum[myIntValue]访问肯定拿不到对应的值,自然返回undefined。
为什么原来的代码不行?
你定义的是字符串枚举,编译后的JavaScript对象只有「键→字符串值」的单向映射,比如:
var MyEnum; (function (MyEnum) { MyEnum["Unknown"] = "Unknown"; MyEnum["SomeValue"] = "SomeValue"; MyEnum["SomeOtherValue"] = "SomeOtherValue"; })(MyEnum || (MyEnum = {}));
可以看到,这个对象里根本没有整数作为键的条目,所以用MyEnum[1]自然找不到东西。而数字枚举会自动生成双向映射(键→数字、数字→键),这就是两者的关键差异。
解决方案:手动建立整数到枚举的映射
根据你的需求,有两种常用的处理方式:
1. 手动定义映射表(推荐,逻辑清晰)
如果外部整数和枚举值的对应关系是固定的,直接创建一个明确的映射对象,把整数和枚举值一一对应起来:
export enum MyEnum { Unknown = 'Unknown', SomeValue = 'SomeValue', SomeOtherValue = 'SomeOtherValue', } // 定义整数到枚举的映射表 const intToMyEnumMap: Record<number, MyEnum> = { 0: MyEnum.Unknown, 1: MyEnum.SomeValue, 2: MyEnum.SomeOtherValue, }; const myIntValue = 1; // 用映射表取值,加默认值防止整数不在映射范围内 const myEnumValue = intToMyEnumMap[myIntValue] ?? MyEnum.Unknown; const myCondition = myEnumValue === MyEnum.SomeValue; // 现在结果为true
2. 利用枚举值数组的索引映射
如果外部整数刚好对应枚举值在Object.values()中的索引(注意数组索引从0开始),可以直接枚举值数组来取值:
export enum MyEnum { Unknown = 'Unknown', SomeValue = 'SomeValue', SomeOtherValue = 'SomeOtherValue', } const myEnumValues = Object.values(MyEnum) as MyEnum[]; const myIntValue = 1; // 同样加默认值兜底 const myEnumValue = myEnumValues[myIntValue] ?? MyEnum.Unknown; const myCondition = myEnumValue === MyEnum.SomeValue; // 结果为true
小提示
不管用哪种方法,都建议加上默认值(比如?? MyEnum.Unknown),防止外部传入的整数不在预期范围内时,出现undefined影响后续的条件判断或逻辑处理。
内容的提问来源于stack exchange,提问作者DTul
相关产品推荐
相关产品推荐

