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’。因此,函数参数类型为枚举时,传入数字也能正常工作,但这样会降低代码的可读性和类型安全。

image


如何为枚举成员指定具体的数值?默认值是什么?

默认情况下,枚举成员的数值从 0 开始递增。如:

enum Month {
	Jan, // 0
	Feb, // 1
	Mar,  // 2
	...
}

当然也可以手动指定某个成员的数值,后续成员会自动递增:

enum Month {
	Jan=1, // 1
	Feb, // 2
	Mar,  // 3
	...
}

为什么推荐在代码中使用枚举而不是直接使用数字或字符串?

使用枚举有以下优势:

  • 可读性强:枚举成员有明确的语义,代码更易懂。
  • 可维护性高:修改枚举定义时,相关代码自动同步,无需全局查找替换。
  • 类型安全:TypeScript 能检查枚举类型,减少错误。

枚举是用“有限集合”来约束和表达系统的边界。好的系统设计,不仅仅靠无限的扩展性,也靠对边界的精准把控。用枚举,既是对代码可读性原则的尊重,也是对未来维护者的无心的善意。


  • 如果你觉得我的工作对你有帮助,可以通过分享这篇文字或者关注同名公众号来支持我,你的支持是我持续创作的最大动力:
    image

  • 转载以及引用请注明原文链接

  • 本博客所有文章除特别声明外,均采用CC 署名-非商业使用-相同方式共享 许可协议。



posted @ 2025-05-27 19:15  Asanwos  阅读(30)  评论(0)    收藏  举报