javascript - 使用整数作为 Typescript 枚举的值?
问题描述
当在 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]
这是一个错误吗?是否可以使用整数值并获得预期的语义?当使用字符串值时,上述示例结果正常。这是一个完整的演示:
解决方案
这就是enum
打字稿的工作原理。它创建一个对象,它将字符串键映射到数字和数字返回到这些键(文档)
反向映射
除了为成员创建具有属性名称的对象外,数字枚举成员还获得从枚举值到枚举名称的反向映射。
这就是将枚举转换为 javascript 的方式(Typescript 游乐场)
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"
键