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

TypeScript枚举映射查找函数:遍历两次返回undefined问题排查

问题原因分析

这种情况大概率是因为你使用的TypeScript枚举在编译后会生成双向映射,导致枚举对象中同时包含正向(枚举键→枚举值)和反向(枚举值→枚举键)的键值对,遍历的时候会把这8个键都扫一遍。

举个例子,假设你的枚举定义是:

enum LookupEnum {
  Option1 = 'opt1',
  Option2 = 'opt2',
  Option3 = 'opt3',
  Option4 = 'opt4'
}

编译后的JavaScript代码会自动添加反向映射:

var LookupEnum;
(function (LookupEnum) {
    LookupEnum["Option1"] = "opt1";
    LookupEnum["Option2"] = "opt2";
    LookupEnum["Option3"] = "opt3";
    LookupEnum["Option4"] = "opt4";
    LookupEnum["opt1"] = "Option1";
    LookupEnum["opt2"] = "Option2";
    LookupEnum["opt3"] = "Option3";
    LookupEnum["opt4"] = "Option4";
})(LookupEnum || (LookupEnum = {}));

当你遍历这个枚举的所有键时,会同时拿到Option1、Option2、Option3、Option4和opt1、opt2、opt3、opt4这8个键。如果你的映射函数只处理正向的枚举键,那处理反向键时就会返回undefined,最终数组就会出现前4个undefined、后4个正确对象的情况。

解决办法

你需要在遍历的时候过滤掉反向映射的键,只保留正向的枚举键。常见的过滤方式有三种:

  • 判断键是否为枚举的原始成员
    如果是字符串枚举,反向键是枚举值(字符串),可以通过判断键是否无法转换为数字来过滤:

    const enumToArray = (enumObj) => {
      return Object.keys(enumObj)
        .filter(key => isNaN(parseInt(key)))
        .map(key => ({
          label: key,
          value: enumObj[key]
        }));
    };
    
  • 使用Object.values结合Set去重
    如果只需要枚举的实际值,可以先取所有值再去重,之后再映射:

    const enumToArray = (enumObj) => {
      return [...new Set(Object.values(enumObj))]
        .filter(value => typeof value === 'string')
        .map(value => ({
          label: value,
          value: value
        }));
    };
    
  • TypeScript环境下用类型约束提取成员
    直接用keyof typeof获取枚举的原始键,避免遍历到反向映射:

    type LookupKeys = keyof typeof LookupEnum;
    const enumToArray = () => {
      return (Object.keys(LookupEnum) as LookupKeys[])
        .map(key => ({
          label: key,
          value: LookupEnum[key]
        }));
    };
    

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:50:36