Typescript:如何检查一个值是否是有效的 Enum 键值?

标签 typescript

有没有办法在 typescript 中获取枚举的名称,例如 nameof(FirstEnum) ?下面的代码有一个丑陋的 if 开关,每次定义新的枚举时都必须扩展该开关。是否有更通用的方法可以在 typescript 中实现相同的目标?

enum FirstEnum {
    First = 0,
    Second = 1,
    Third = 2,
}
enum SecondEnum {
    One,
    Two,
}


function translateEnum(type$, val): string {
    let lookupKey = '';
    if (type$ === FirstEnum) {
        lookupKey = `firstenum.${FirstEnum[val]}`;
    } else if (type$ === SecondEnum) {
        lookupKey = `secondenum.${SecondEnum[val]}`;
    } else {
        throw new Error('not supported');
    }
    //lookupkey example: secondenum.One
    const result = ''; //translate here, ex. await translationService.translate(lookupkey);
    return result;
}

translateEnum(SecondEnum , SecondEnum.One);

最佳答案

自 Typescript Enums被转换为 JavaScript 对象,您可以使用 in 检查 enum 键值是否是 enum 的成员运算符(operator)。请注意,这仅适用于非 const 且基于数字的枚举。

enum FirstEnum {
    First = 0,
    Second = 1,
    Third = 2,
}
enum SecondEnum {
    One,
    Two,
}


function translateEnum(val: FirstEnum | SecondEnum): string {
    let lookupKey = '';
    if (val in FirstEnum || val in SecondEnum) {
      console.log(`Enum value ${val} is valid!`);
      //lookupkey example: secondenum.One
      const result = ''; //translate here, ex. await translationService.translate(lookupkey);
      return result;
    } else {
        console.log(`Enum value ${val} not supported.`);
        throw new Error('not supported');
    }
}

translateEnum(SecondEnum.One);

translateEnum(10);

输出

Enum value 0 is valid!
Enum value 10 not supported.
Uncaught Error: not supported
    at translateEnum (eval at <anonymous> (main-0.js:804), <anonymous>:23:15)
    at eval (eval at <anonymous> (main-0.js:804), <anonymous>:27:1)
    at main-0.js:804

更多信息

查看堆栈溢出问题 Check if value exists in enum in TypeScript .

关于Typescript:如何检查一个值是否是有效的 Enum 键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636511/

相关文章:

angular - 模块在 Angular 模块中没有导出成员错误

javascript - 无法将 ngModel 绑定(bind)到 p-dropdown 值(Angular)

Typescript - 无法让 'import' 语句发挥作用

typescript - 检查属性是否用特定注释装饰 - Typescript

typescript - 如何在 typescript 中创建静态 map ?

javascript - 如何更改我的 AngularJS 服务以使用 Typescript?

reactjs - 使用默认导出和命名导出在 typescript 中声明模块

reactjs - React Storybook 在 args 中传递函数

angular - ControlValueAccessor 和触摸

angularjs - AngularJs + TypeScript : Uncaught Error: [$injector:modulerr] Failed to instantiate module