# 枚举类型

原文地址 (opens new window)

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

# 什么是枚举

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

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

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

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

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

# TypeScript 中的枚举类型例子

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

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

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

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

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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

可以这样调用这个函数:

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

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

# TypeScript 中的枚举是如何工作的

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

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

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

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

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

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

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

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

# 指定枚举成员的数值

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

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

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

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

# 什么时候使用枚举

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

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

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

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

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

const request = {
  id: 1,
  status: ApprovalStatus.approved,
  description: 'Please approve this request',
};

if (request.status === ApprovalStatus.approved) {
  // 发送邮件
  console.log('Send email to the Applicant...');
}
1
2
3
4
5
6
7
8
9
10

# 小结

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