title: 枚举类型

枚举类型

原文地址

在本教程中,你将学习 TypeScript 中的枚举类型,以及如何更高效地使用它。

什么是枚举

枚举是一些命名常量值的组合,Enum 代表枚举类型,按照下面的步骤来定义枚举:

  • 首先,把变量名写在 enum 关键字之后;
  • 然后,定义枚举中的常量值。

下面展示定义枚举的语法:

  1. enum name {constant1, constant2, ...};

在这个语法中,constant1constant2 等等被称为枚举的成员。

TypeScript 中的枚举类型例子

下面的例子创建一个表示一年中所有月份的枚举:

  1. enum Month {
  2. Jan,
  3. Feb,
  4. Mar,
  5. Apr,
  6. May,
  7. Jun,
  8. Jul,
  9. Aug,
  10. Sep,
  11. Oct,
  12. Nov,
  13. Dec,
  14. }

在这个例子中,枚举名为 Month ,它的常量值有 Jan, FebMar 等等。

下面声明一个函数,它使用 Month 枚举类型作为参数 month 的类型:

  1. function isItSummer(month: Month) {
  2. let isSummer: boolean;
  3. switch (month) {
  4. case Month.Jun:
  5. case Month.Jul:
  6. case Month.Aug:
  7. isSummer = true;
  8. break;
  9. default:
  10. isSummer = false;
  11. break;
  12. }
  13. return isSummer;
  14. }

可以这样调用这个函数:

  1. console.log(isItSummer(Month.Jun)); // true

这个例子使用枚举中的常量值,比如 Jan, FebMar 等等,而不是 1, 23 等等这些值,使得代码更加清晰易懂。

TypeScript 中的枚举是如何工作的

在代码中使用枚举常量值是一个很好的实践方法。不过下面的例子把一个数字而不是枚举值传递给 isItSummer() 函数,它也能正常工作:

  1. console.log(isItSummer(6)); // true

这个例子使用了一个数字 (6) 代替了 Month 中的枚举常量值,它也能正常工作。

检查下 Month 枚举生成的 Javascript 代码:

  1. var Month;
  2. (function (Month) {
  3. Month[(Month['Jan'] = 0)] = 'Jan';
  4. Month[(Month['Feb'] = 1)] = 'Feb';
  5. Month[(Month['Mar'] = 2)] = 'Mar';
  6. Month[(Month['Apr'] = 3)] = 'Apr';
  7. Month[(Month['May'] = 4)] = 'May';
  8. Month[(Month['Jun'] = 5)] = 'Jun';
  9. Month[(Month['Jul'] = 6)] = 'Jul';
  10. Month[(Month['Aug'] = 7)] = 'Aug';
  11. Month[(Month['Sep'] = 8)] = 'Sep';
  12. Month[(Month['Oct'] = 9)] = 'Oct';
  13. Month[(Month['Nov'] = 10)] = 'Nov';
  14. Month[(Month['Dec'] = 11)] = 'Dec';
  15. })(Month || (Month = {}));

可以在控制台打印 Month 变量:

  1. {
  2. '0': 'Jan',
  3. '1': 'Feb',
  4. '2': 'Mar',
  5. '3': 'Apr',
  6. '4': 'May',
  7. '5': 'Jun',
  8. '6': 'Jul',
  9. '7': 'Aug',
  10. '8': 'Sep',
  11. '9': 'Oct',
  12. '10': 'Nov',
  13. '11': 'Dec',
  14. Jan: 0,
  15. Feb: 1,
  16. Mar: 2,
  17. Apr: 3,
  18. May: 4,
  19. Jun: 5,
  20. Jul: 6,
  21. Aug: 7,
  22. Sep: 8,
  23. Oct: 9,
  24. Nov: 10,
  25. Dec: 11
  26. }

从输出中可以清楚地看到,TypeScript 枚举本质上是 JavaScript 中的对象,该对象在枚举中声明了命名属性,比如 Jan0,而 Feb1,也有数字键和表示命名常量的字符串值。这就是为什么你可以向接受枚举的函数传递一个数字的原因,换句话说,枚举成员既是数字也是已定义的常量值。

指定枚举成员的数值

TypeScript 根据枚举定义中成员的出现顺序来定义枚举成员的数值,比如 Jan0Feb1 等等。

可以显式地为枚举成员指定数值,如下所示:

  1. enum Month {
  2. Jan = 1,
  3. Feb,
  4. Mar,
  5. Apr,
  6. May,
  7. Jun,
  8. Jul,
  9. Aug,
  10. Sep,
  11. Oct,
  12. Nov,
  13. Dec,
  14. }

在这个例子中,Jan 常量的值为 1 而不是 0Feb 的值为 2Mar 的值为 3 等等。

什么时候使用枚举

在下面情况中可以使用枚举:

  • 有一组紧密相关且数量不多的固定值集合;
  • 这些值在编译时已知。

例如,你可以使用枚举来表示审批状态:

  1. enum ApprovalStatus {
  2. draft,
  3. submitted,
  4. approved,
  5. rejected,
  6. }

然后,你可以像下面这样来使用 ApprovalStatus 枚举:

  1. const request = {
  2. id: 1,
  3. status: ApprovalStatus.approved,
  4. description: 'Please approve this request',
  5. };
  6. if (request.status === ApprovalStatus.approved) {
  7. // 发送邮件
  8. console.log('Send email to the Applicant...');
  9. }

小结

  • TypeScript 中的枚举是一组常量值的集合;
  • 本质上,枚举是一个在枚举定义中声明了命名属性的 JavaScript 对象;
  • 如果你有一组紧密相关且数量不多的固定值集合,并且这些值在编译时已知,那么一定要使用枚举