Skip to content

Typescript-Enum 现状

看到有 文章 说 Typescript 官方不推荐使用 Enum 了

起因

TypeScript 5.8 带来了 --erasableSyntaxOnly 标志,禁用了如枚举和命名空间等语法。

Node.js v23 与 Deno 和 Bun 一起添加了无需构建步骤即可运行 TypeScript 文件的支持。但是有一个限制是仅支持包含可擦除 TypeScript 语法的文件。

由于枚举和命名空间被转换为 JavaScript 对象,因此违反了该规则。

因此, TypeScript 团队可以使用新的编译器标志禁止这些功能,并让人们轻松确保他们的 TS 代码可以直接运行。

可擦除语法

可擦除语法就是仅在编译时存在、不影响运行时的语法,例如 type, interface

枚举缺陷

社区中主要反映的主要问题是:枚举编译后会生成包含正向(名称→值)和反向(值→名称)映射的对象,增加代码体积

typescript
enum Direction { Up = 1, Down = 2 }

// 编译后的数字枚举
var Direction;
(function (Direction) {
  Direction[Direction["Up"] = 1] = "Up";
  Direction[Direction["Down"] = 2] = "Down";
})(Direction || (Direction = {}));

替代方案

方案一 🤔

使用联合类型替代 enum

javascript
type Direction = 'Up' | 'Down'
  • 优点是定义起来简单
  • 缺点是如果发生变动,所有使用的地方都要修改

方案二 👍

使用类型字面量和对象断言

javascript
const Direction = {
  Up:'Up',
  Down:'Down',
} as const

type DIRECTION_TYPE = typeof Direction[keyof typeof Direction]

function sortBy(direction: DIRECTION_TYPE) {
  // do some thing
}

sortBy(Direction.Up)
sortBy('Down')

定义相对麻烦,但是可维护性更强