使用 const enum

4,149 阅读1分钟

最近团队制定了一个typescript规范是所有枚举使用const enum, 为什么呢?我们来看: enum 生成的结构如下:

image
是一个[键-值,值-键]间的映射关系,而实际我们没有需要[值-键]映射的场景, 是个浪费,而 const enum 生成的代码是内联的:
image
这解决了问题。但是我们项目中使用的 babel 不支持这个语法,网上有一个 plugin: babel-plugin-const-enum)支持了这个语法,只是生成的代码有差别:
image
会转换成一个普通的map,但这个正是我们需要的结果,考虑这样的情况:
image
可以看到如果枚举值是字符串且较长,使用的地方多,那么生成的代码会很多,这种情况下 babel-plugin-const-enum 生成的结果较好, 如果是自增的数字值还是typescript理想。

还有个比较好的点是现有的eslint规则稍加配置就可以支持这个规范:


{
  "no-restricted-syntax": [
    "error",
    // 默认的
    // ...
    // 必须使用 const enum
    {
      "selector": "TSEnumDeclaration:not([const=true])",
      "message": "Don't declare non-const enums"
    }
  ]
}

配置需要把默认的其他限制语法也加上,不然被覆盖就没了,获取默认值的步骤是:

  1. npx eslint --print-config src/index.ts > eslintrc.log (src/index.ts可以是项目中的其他文件)
  2. eslintrc.log里搜索no-restricted-syntax, 复制默认值即可