【问题标题】:Using integers as values with a Typescript Enum?使用整数作为 Typescript 枚举的值?
【发布时间】:2020-06-08 14:34:34
【问题描述】:

当在 Typescript 枚举中使用整数作为值时,它们似乎都变成了键。这是一个例子:


enum Precision {
  ONE = 1,
  TWO = 2
}

const keys = Object.keys(Precision)
console.log(keys) //["1", "2", "ONE", "TWO"]

如果我们尝试获取这样的值:

let v:number[] = Object.keys(Precision).map(key => Precision[key])

console.log(v)  //["ONE", "TWO", 1, 2]

这是一个错误吗?是否可以使用整数值并获得预期的语义?当使用字符串值时,上述示例结果正常。这是一个完整的演示:

https://stackblitz.com/edit/typescript-enum-values

【问题讨论】:

    标签: javascript typescript enums


    【解决方案1】:

    这就是enum 在打字稿中的工作方式。它创建了一个对象,它将字符串键映射到数字,并将数字映射回这些键 (Documentation)

    反向映射

    除了为成员创建具有属性名称的对象外,数字枚举成员还获得从枚举值到枚举名称的反向映射。

    这就是如何将枚举转译为 javascript (Typescript playground)

    var Precision;
    (function (Precision) {
        Precision[Precision["ONE"] = 1] = "ONE";
        Precision[Precision["TWO"] = 2] = "TWO";
    })(Precision || (Precision = {}));
    

    这是一种奇特的写作方式:

    var Precision = {}
    
    Precision["ONE"] = 1
    Precision["TWO"] = 2
    
    Precision[1] = "ONE"
    Precision[2] = "TWO"
    

    这使您可以轻松地将字符串值转换为数字和使用括号表示法将数值转换为字符串。

    请注意,只有数字枚举值才能获得此反向映射。如果你创建

    enum Precision {
      ONE = "1 value",
      TWO = 2
    }
    

    它被转换为:

    var Precision = {};
    
    Precision["ONE"] = "1 value"
    Precision["TWO"] = 2
    
    Precision[2] = "TWO";
    

    对象中没有"1 value"

    【讨论】:

    • 你知道是否有一种方法可以只使用按键(等号左侧)吗?
    • @Ole Object.values(Precision).filter(v => !Number.isFinite(v) )
    • 很好 - 喜欢它!
    猜你喜欢
    • 2022-01-15
    • 2015-08-26
    • 2017-05-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2021-06-29
    • 2020-08-05
    相关资源
    最近更新 更多