我想在JS中定义类似枚举的结构,但有两个要求:
我知道创建这样的枚举的方法通常满足一个要求或另一个要求,而不是两者.
我试过了:
const MyEnum = {
a: 0,
b: 1,
c: 2
};
Run Code Online (Sandbox Code Playgroud)
枚举本身是常量,但值仍然是可变的,我无法有效地将值映射回名称.
在撰写一个enum打字稿时,它会输出:
var MyEnum;
(function (MyEnum) {
MyEnum[MyEnum["a"] = 0] = "a";
MyEnum[MyEnum["b"] = 1] = "b";
MyEnum[MyEnum["c"] = 2] = "c";
})(MyEnum || (MyEnum = {}));
Run Code Online (Sandbox Code Playgroud)
这可以映射两种方式,但仍然没有常量值.
我发现满足这两个要求的唯一选择是在类上使用getter:
class MyEnum {
get a() {
return 0;
}
...
}
Run Code Online (Sandbox Code Playgroud)
这种方法极大地限制了合法名称并且有很多开销,特别是在没有内联(或不能)内联getter的浏览器中.
const MyEnum = Object.freeze({
a: 0,
b: 1,
c: 2
});
Run Code Online (Sandbox Code Playgroud)
这很好地满足了常量要求,但没有提供将值映射回名称的好方法.
我可以写一个帮助器来构建反向映射,如:
function reverseEnum(enum) {
Object.keys(enum).forEach(k …Run Code Online (Sandbox Code Playgroud)