相关疑难解决方法(0)

ES6只读枚举,可以将值映射到名称

我想在JS中定义类似枚举的结构,但有两个要求:

  1. 值是只读的,即没有用户可以分配给它们.
  2. 值(0,1,2,...)可以映射回名称(与Java的名称方法一样)

我知道创建这样的枚举的方法通常满足一个要求或另一个要求,而不是两者.

我试过了:

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的浏览器中.

@Shmiddty建议冻结一个物体:

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)

enums ecmascript-6

17
推荐指数
2
解决办法
2万
查看次数

标签 统计

ecmascript-6 ×1

enums ×1