enum Status { Pending, Success, Fail } 编译后生成一个真实的 JS 对象(双向映射:Status.Pending === 0 且 Status[0] === 'Pending')。数字枚举不写值时从 0 自增;字符串枚举可读性更好,打印日志时直接显示语义。开发中枚举成员就往往被当作联合类型来约束取值范围。
枚举的争议:它编译后会生成运行时代码(与 type 联合类型不同),且 const enum 在某些打包器(isolatedModules 模式下的 Vite/esbuild)下受限。现代社区更推荐用「字面量联合类型 + as const 常量表」替代,二者各有场景,团队统一即可。
// 数字枚举(默认从 0 自增)
enum Status { Pending, Success, Fail }
const s: Status = Status.Success; // 1
console.log(Status[1]); // "Success"(反向映射)
// 字符串枚举(日志友好)
enum Role {
Admin = "admin",
User = "user",
}
// 编译产物:真实的 JS 对象
// var Status; (function (Status) {
// Status[Status["Pending"] = 0] = "Pending"; ... })
// 替代方案:字面量联合 + as const(零运行时开销)
const CODE = { OK: 200, NOT_FOUND: 404 } as const;
type Code = (typeof CODE)[keyof typeof CODE]; // 200 | 404