- 每個枚舉成員都帶有一個值酪呻,它可以是 常量或 計算出來的
數(shù)字枚舉
-
數(shù)字枚舉會有自增長行為(當前成員不帶有初始化器且它之前的枚舉成員是一個 數(shù)字常量抒和。 這種情況下巾兆,當前枚舉成員的值為它上一個枚舉成員的值加1)管怠,在未賦值的情況下袭祟,默認從零開始
enum Direction { Up = 1, Down, // 2 Left, // 3 Right // 4 }
字符串枚舉
-
字符串枚舉里遏插,每個成員都必須用字符串字面量捂贿,或另外一個字符串枚舉成員進行初始化
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
異構(gòu)枚舉
-
可以但不好
enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES", }
字面量枚舉成員
一種特殊的非計算的常量枚舉成員的子集
-
指不帶有初始值的常量枚舉成員,或者是值被初始化為
- 任何字符串字面量(例如:
"foo"
涩堤,"bar"
眷蜓,"baz"
) - 任何數(shù)字字面量(例如:
1
,100
) - 應(yīng)用了一元
-
符號的數(shù)字字面量(例如:-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, }
-
枚舉類型本身變成了每個枚舉成員的 聯(lián)合;即類型系統(tǒng)可以知道枚舉里的值的集合
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'. // 類型系統(tǒng)知道枚舉里面只有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);
反向映射
-
即數(shù)字枚舉可以通過成員獲取編號吁系,也可以通過編號獲取成員
enum Enum { A } let a = Enum.A; // 0 let nameOfA = Enum[a]; // "A"
const
枚舉
-
常量枚舉 ,只能使用常量枚舉表達式白魂,且在編譯階段會被刪除汽纤;不允許包含計算成員,因此在使用的地方可以被內(nèi)聯(lián)進來
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 */];
外部枚舉
外部枚舉用來描述已經(jīng)存在的枚舉類型的形狀
-
在正常的枚舉里福荸,沒有初始化方法的成員被當成常數(shù)成員蕴坪。 對于非常數(shù)的外部枚舉而言,沒有初始化方法時被當做需要經(jīng)過計算的
declare enum Enum { A = 1, B, C = 2 }