TypeScript的枚举类型
什么是 TypeScript 的 enum(枚举)?它的基本语法是什么?
TypeScript 的枚举(enum)是一组具名的常量值,用于表达一组固定且相关的取值。定义使用如下语法:
enum name {constant1, constant2, ...}
其中,使用关键字 enum 其后紧跟枚举的名称,constant1、constant2 等是枚举的成员。
枚举的实际使用场景是什么?
枚举适用于一组有限且固定的值,且这些值在编译时已知。例如:
- 固定的分类(如星期、月份、角色类型),下面表示一年中的月份:
enum Month {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}
- 状态机的状态(如审批流、订单状态),下面定义了一个审批状态枚举:
enum ApprovalStatus {draft, submitted, approved, rejected}
- 选项集合(如权限、配置项),比如定义一个日志级别的枚举:
enum LogLevel {Debug, Info, Warn, Error, Fatal}
使用枚举可以让代码更直观、更具可读性和可维护性,避免了“魔法数字”或“魔法字符串”的出现。如下面“判断当前月份是否为夏天”的函数,就避免了使用1,2,3等魔法数字表达月份:
function isItSummer(month: Month) {
let isSummer: boolean;
switch (month) {
case Month.Jun:
case Month.Jul:
case Month.Aug:
isSummer = true;
break;
default:
isSummer = false;
break;
}
return isSummer;
}
TypeScript 枚举的底层实现是什么?为什么可以用数字代替枚举成员?
TypeScript 编译后的枚举其实是一个 JavaScript 对象,既有“名称到数字”的映射,也有“数字到名称”的映射。例如上面枚举 Month,编译后的JavaScript 代码表示为:
var Month;
(function (Month) {
Month[(Month["Jan"] = 1)] = "Jan";
Month[(Month["Feb"] = 2)] = "Feb";
Month[(Month["Mar"] = 3)] = "Mar";
Month[(Month["Apr"] = 4)] = "Apr";
Month[(Month["May"] = 5)] = "May";
Month[(Month["Jun"] = 6)] = "Jun";
Month[(Month["Jul"] = 7)] = "Jul";
Month[(Month["Aug"] = 8)] = "Aug";
Month[(Month["Sep"] = 9)] = "Sep";
Month[(Month["Oct"] = 10)] = "Oct";
Month[(Month["Nov"] = 11)] = "Nov";
Month[(Month["Dec"] = 12)] = "Dec";
})(Month || (Month = {}));
如果把上面的变量 Month 输出到控制台,会得到如下结果:
{
'1': 'Jan',
'2': 'Feb',
'3': 'Mar',
'4': 'Apr',
'5': 'May',
'6': 'Jun',
'7': 'Jul',
'8': 'Aug',
'9': 'Sep',
'10': 'Oct',
'11': 'Nov',
'12': 'Dec',
Jan: 1,
Feb: 2,
Mar: 3,
Apr: 4,
May: 5,
Jun: 6,
Jul: 7,
Aug: 8,
Sep: 9,
Oct: 10,
Nov: 11,
Dec: 12
}
这意味着你既可以用 Month.Jan 访问到 0,也可以用 0 访问到 ‘Jan’。因此,函数参数类型为枚举时,传入数字也能正常工作,但这样会降低代码的可读性和类型安全。

如何为枚举成员指定具体的数值?默认值是什么?
默认情况下,枚举成员的数值从 0 开始递增。如:
enum Month {
Jan, // 0
Feb, // 1
Mar, // 2
...
}
当然也可以手动指定某个成员的数值,后续成员会自动递增:
enum Month {
Jan=1, // 1
Feb, // 2
Mar, // 3
...
}
为什么推荐在代码中使用枚举而不是直接使用数字或字符串?
使用枚举有以下优势:
- 可读性强:枚举成员有明确的语义,代码更易懂。
- 可维护性高:修改枚举定义时,相关代码自动同步,无需全局查找替换。
- 类型安全:TypeScript 能检查枚举类型,减少错误。
枚举是用“有限集合”来约束和表达系统的边界。好的系统设计,不仅仅靠无限的扩展性,也靠对边界的精准把控。用枚举,既是对代码可读性原则的尊重,也是对未来维护者的无心的善意。
-
如果你觉得我的工作对你有帮助,可以通过分享这篇文字或者关注同名公众号来支持我,你的支持是我持续创作的最大动力:
![image]()
-
转载以及引用请注明原文链接。
-
本博客所有文章除特别声明外,均采用CC 署名-非商业使用-相同方式共享 许可协议。

介绍TypeScript的枚举类型和底层原理

浙公网安备 33010602011771号