- 每个枚举成员都带有一个值,它可以是 常量或 计算出来的
数字枚举
-
数字枚举会有自增长行为(当前成员不带有初始化器且它之前的枚举成员是一个 数字常量。 这种情况下,当前枚举成员的值为它上一个枚举成员的值加1),在未赋值的情况下,默认从零开始
enum Direction { Up = 1, Down, // 2 Left, // 3 Right // 4 }
字符串枚举
-
字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
异构枚举
-
可以但不好
enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES", }
字面量枚举成员
一种特殊的非计算的常量枚举成员的子集
-
指不带有初始值的常量枚举成员,或者是值被初始化为
- 任何字符串字面量(例如:
"foo"
,"bar"
,"baz"
) - 任何数字字面量(例如:
1
,100
) - 应用了一元
-
符号的数字字面量(例如:-1
,-100
)
- 任何字符串字面量(例如:
-
当所有枚举成员都拥有字面量枚举值时,这些枚举成员成为了类型
enum ShapeKind { Circle, Square, } interface Circle { kind: ShapeKind.Circle; radius: number; } interface Square { kind: ShapeKind.Square; sideLength: number; } let c: Circle = { kind: ShapeKind.Square, // ~~~~~~~~~~~~~~~~ Error! radius: 100, }
-
枚举类型本身变成了每个枚举成员的 联合;即类型系统可以知道枚举里的值的集合
enum E { Foo, Bar, } function f(x: E) { if (x !== E.Foo || x !== E.Bar) { // ~~~~~~~~~~~ // Error! Operator '!==' cannot be applied to types 'E.Foo' and 'E.Bar'. // 类型系统知道枚举里面只有Foo和Bar,因此||后的判断不必要 } }
运行时的枚举
-
枚举是在运行时真正存在的对象
enum E { X, Y, Z } function f(obj: { X: number }) { return obj.X; } // Works, since 'E' has a property named 'X' which is a number. f(E);
反向映射
-
即数字枚举可以通过成员获取编号,也可以通过编号获取成员
enum Enum { A } let a = Enum.A; // 0 let nameOfA = Enum[a]; // "A"
const
枚举
-
常量枚举 ,只能使用常量枚举表达式,且在编译阶段会被删除;不允许包含计算成员,因此在使用的地方可以被内联进来
const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right] // 编译后生成 var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
外部枚举
外部枚举用来描述已经存在的枚举类型的形状
-
在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的
declare enum Enum { A = 1, B, C = 2 }