TypeScript 枚举
摘要:在本教程中,你将了解 TypeScript 枚举类型以及如何有效地使用它。
什么是枚举
枚举是一组命名的常量值。 Enum 代表枚举类型。
要定义枚举,请执行以下步骤:
- 首先,使用 enum 关键字,后跟枚举名称。
 - 然后,定义枚举的常量值。
 
下面显示了定义枚举的语法:
enum name {constant1, constant2, ...};
在此语法中,constant1、constant2 等也称为枚举成员。
TypeScript 枚举类型示例
以下示例创建一个表示一年中月份的枚举:
enum Month {
    Jan,
    Feb,
    Mar,
    Apr,
    May,
    Jun,
    Jul,
    Aug,
    Sep,
    Oct,
    Nov,
    Dec
};
在此示例中,枚举名称为 Month,常量值为 Jan、Feb、Mar 等。
下面声明了一个使用 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;
}
调用方式如下:
console.log(isItSummer(Month.Jun)); // true
此示例在枚举中使用包括 Jan、Feb、Mar... 在内的常量值,而不是像 1、2、3... 这样的魔法值,这使得代码更加清晰易懂。
TypeScript 枚举的工作原理
在代码中使用枚举定义的常量值是一个很好的做法。
但是,以下示例将数字而不是枚举传递给 isItSummer() 函数。 它是有效的。
console.log(isItSummer(6)); // true
此示例使用数字 (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 = {}));
你可以把 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
}
从输出中可以清楚地看到,TypeScript 枚举是 JavaScript 中的一个对象。 该对象具有在枚举中声明的命名属性。 例如,Jan 为 0,Feb 为 1。
生成的对象还含有数字键和表示命名常量的字符串值。
这就是为什么你可以把数字传递到接受枚举的函数中。 换句话说,枚举成员既是数字又是定义的常量。
指定枚举成员的编号
TypeScript 根据枚举定义中出现的成员的顺序来定义枚举成员的数值。 例如,Jan 取 0,Feb 取 1,等等。
可以像这样显式指定枚举成员的数字:
enum Month {
    Jan = 1,
    Feb,
    Mar,
    Apr,
    May,
    Jun,
    Jul,
    Aug,
    Sep,
    Oct,
    Nov,
    Dec
};
在此示例中,Jan 常量值取 1 而不是 0。Feb 取 2,Mar 取 3,依此类推。
何时使用枚举
当你执行以下操作时,应该使用枚举:
- 拥有一小组密切相关的固定值
 - 这些值在编译时是已知的。
 
例如,可以使用枚举来表示批准状态:
enum ApprovalStatus {
    draft,
    submitted,
    approved,
    rejected
};
然后,可以这样使用 ApprovalStatus 枚举:
const request =  {
    id: 1,
    status: ApprovalStatus.approved,
    description: 'Please approve this request'
};
if(request.status === ApprovalStatus.approved) {
    // send an email
    console.log('Send email to the Applicant...');
}
概括
- TypeScript 枚举是一组常量值。
 - 从本质上讲,枚举是一个 JavaScript 对象,其命名属性在枚举定义中声明。
 - 当你有一小组密切相关且在编译时已知的固定值时,请使用枚举。