【问题标题】:Typescript: How to check if a value is a valid Enum key value? [duplicate]打字稿:如何检查一个值是否是有效的枚举键值? [复制]
【发布时间】:2019-12-29 09:10:14
【问题描述】:

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

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


    【解决方案1】:

    由于 Typescript Enums 被转换为 JavaScript 对象,您可以使用 in 运算符检查 enum 键值是否是 enums 的成员。请注意,这仅适用于不是const 并且基于数字的enums

    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

    【讨论】:

    • 恕我直言,提问者希望从枚举 FirstEnum 中获取 "FirstEnum"。不过我认为这是不可能的。
    • Tnx 全部支持。我从这个答案中得出结论,不可能摆脱 if 语句。如果可能的话,我希望这个功能能尽快添加到 typescript 中。
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 2022-08-03
    • 2014-09-19
    • 2018-07-23
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多