ES2015环境下如何仅遍历字符串值TypeScript Enum的键
解决方案
你遇到的枚举同时返回键值的问题,是因为你给字符串枚举的值添加了不必要的<any>类型断言,TypeScript会将该枚举判定为非纯字符串枚举,自动生成「键→值」「值→键」的双向映射,所以Object.keys会返回所有键和值。以下两种方案均完全兼容ES2015运行环境:
方案1:修正枚举写法(最优解,无额外性能损耗)
直接去掉<any>断言,TypeScript原生支持字符串枚举赋值,修正后编译出的枚举对象仅存在正向映射,直接调用Object.keys即可拿到所有纯键。
// 无需<any>断言的标准字符串枚举写法 enum School { Denver = "Denver School", Wyoming = "Wyoming High School", Michigan = "Michigan Junior High", } const stringKeys = Object.keys(School); console.log('the actual keys:'); for (const key of stringKeys) { console.log(key); } // 输出结果: // Denver // Wyoming // Michigan
方案2:兼容旧枚举写法(必须保留时使用)
如果旧代码不允许修改枚举定义,可以通过ES2015原生支持的Set做值过滤,筛选出纯键:
enum School { Denver = <any>"Denver School", Wyoming = <any>"Wyoming High School", Michigan = <any>"Michigan Junior High", } // 先收集所有枚举值存入Set const valueSet = new Set(Object.keys(School).map(key => School[key])); // 过滤掉属于值的键,剩下的就是原始枚举键 const stringKeys = Object.keys(School).filter(key => !valueSet.has(key)); console.log('the actual keys:'); for (const key of stringKeys) { console.log(key); } // 输出结果: // Denver // Wyoming // Michigan
内容的提问来源于stack exchange,提问作者Claude Roy
相关产品推荐
相关产品推荐

