枚举类型是Number原语类型的独特子类型,具有一组关联的命名常量,这些常量定义了枚举类型的可能值。
枚举声明声明一个枚举类型和一个枚举对象。
EnumDeclaration:
constopt enum BindingIdentifier { EnumBodyopt }
EnumDeclaration在包含的声明空间中引入了命名类型(枚举类型)和命名值(枚举对象)。 枚举类型是Number原语类型的独特子类型。 枚举对象是一个匿名对象类型的值,其中包含一组属性(所有枚举类型),这些属性与声明主体中为枚举类型声明的值相对应。 枚举对象的类型还包括带有数字签名[[x:number]:string’的数字索引签名。
枚举声明的BindingIdentifier可能不是预定义的类型名称之一(第3.8.1节)。
当枚举声明包含const修饰符时,它被称为常量枚举声明。 常量枚举声明的成员都必须具有可以在编译时计算的常量值。 常量枚举声明将在9.4节中讨论。
这个例子
enum Color { Red, Green, Blue }
声明Number原始类型的子类型称为“ Color”,并引入一个变量“ Color”,其类型与声明相对应
var Color: {
[x: number]: string;
Red: Color;
Green: Color;
Blue: Color;
};
数字索引签名反映了在每个枚举对象中自动生成的“反向映射”,如第9.5节所述。 反向映射提供了一种获取枚举值的字符串表示形式的便捷方法。 例如
var c = Color.Red;
console.log(Color[c]); // Outputs "Red"
枚举声明的主体定义了零个或多个枚举成员,这些成员是枚举类型的命名值。 每个枚举成员都有一个由枚举声明引入的原始类型的关联数值。
EnumBody:
EnumMemberList ,opt
EnumMemberList:
EnumMember
EnumMemberList , EnumMember
EnumMember:
PropertyName
PropertyName = EnumValue
EnumValue:
AssignmentExpression
枚举成员的PropertyName不能是计算的属性名称(2.2.3)。
枚举成员可以是常量成员,也可以是计算成员。常量成员具有已知的常量值,该值将替换生成的JavaScript代码中对成员的引用。计算成员具有在运行时计算的值,而在编译时未知。不会对引用的计算成员执行替换。
枚举成员的分类如下:
枚举值表达式的类型必须为Any,Number基本类型或枚举类型本身。
常量枚举表达式是表达式语法的子集,可以在编译时对其进行全面评估。如果表达式是下列之一,则将其视为常量枚举表达式:
在这个例子中
enum Test {
A,
B,
C = Math.floor(Math.random() * 1000),
D = 10,
E
}
“ A”,“ B”,“ D”和“ E”是常数成员,分别具有值0、1、10和11,而“ C”是计算成员。
在这个例子中
enum Style {
None = 0,
Bold = 1,
Italic = 2,
Underline = 4,
Emphasis = Bold | Italic,
Hyperlink = Bold | Underline
}
所有成员都是常任理事国。 注意,枚举成员声明可以无条件引用其他枚举成员。 同样,由于枚举是Number原语类型的子类型,因此可以使用数字运算符(例如按位OR运算符)来计算枚举值。
枚举是“开放式的”,并且相对于公共根具有相同限定名称的枚举声明(如第2.3节中所定义)定义单个枚举类型并构成单个枚举对象。
一个枚举声明不可能继续另一个枚举的自动编号顺序,并且当一个枚举类型具有多个声明时,只允许一个声明为第一个成员省略一个值。
合并枚举声明时,它们必须全部指定const修饰符或全部不指定const修饰符。
指定const修饰符的枚举声明是常量枚举声明。 在常量枚举声明中,所有成员都必须具有常量值,并且成员声明指定未归类为常量枚举表达式的表达式是错误的。
与常规枚举声明不同,常量枚举声明在生成的JavaScript代码中被完全擦除。 因此,在除选择枚举成员之一的属性访问之外的任何其他上下文中引用常量枚举对象都是错误的。 例如:
const enum Comparison {
LessThan = -1,
EqualTo = 0,
GreaterThan = 1
}
var x = Comparison.EqualTo; // Ok, replaced with 0 in emitted code
var y = Comparison[Comparison.EqualTo]; // Error
var z = Comparison; // Error
整个const枚举声明在生成的JavaScript代码中被擦除。 因此,对枚举对象的唯一允许引用是那些被枚举成员值替换的引用。
枚举声明生成的JavaScript等效于以下内容:
var <EnumName>;
(function (<EnumName>) {
<EnumMemberAssignments>
})(<EnumName>||(<EnumName>={}));
EnumName是枚举的名称。
EnumMemberAssignments是一系列分配,每个枚举成员按声明的顺序分配一个,形式为
<EnumName>[<EnumName>["" ] = <Value>] = "" ;
其中MemberName是枚举成员的名称,而Value是分配的常量值或为计算值表达式生成的代码。
例如,第9.1节中的“颜色”枚举示例生成以下JavaScript:
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(Color||(Color={}));