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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:42:21