打字稿:如何检查一个值是不是是有效的枚举键值? [复制]

Posted

技术标签:

【中文标题】打字稿:如何检查一个值是不是是有效的枚举键值? [复制]【英文标题】: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);

【问题讨论】:

【参考方案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 中。

以上是关于打字稿:如何检查一个值是不是是有效的枚举键值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:要求枚举中的所有键都是有效类型

打字稿枚举比较'in'有效,但不是'==='

如何在打字稿接口/类型中将枚举值类型转换为数组?

打字稿:按值检查对象是不是存在于数组中

打字稿:传递类函数时如何检查它们是不是绑定

打字稿枚举值作为数组