枚舉(Enum)類型用於取值被限定在必定範圍內的場景,好比一週只能有七天,顏色限定爲紅綠藍等函數
使用枚舉來定義關鍵字code
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
枚舉成員會被賦值成從0開始,同行枚舉名和值也會進行反向映射:對象
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; console.log(Days[0] === 'Sun'); //true console.log(Days['Sat'] === 6);//true
enum Days {Sun=7, Mon, Tue, Wed=1, Thu, Fri, Sat};
未被賦值的枚舉項會接着上一個枚舉項遞增 如:ip
上面的枚舉值會被編譯成如下結果 {1: "Wed", 2: "Thu", 3: "Fri", 4: "Sat", 7: "Sun", 8: "Mon", 9: "Tue", Sun: 7, Mon: 8, Tue: 9, Wed: 1, Thu: 2, Fri: 3, Sat: 4, Sun: 7, Mon: 8, Tue: 9 }
若是未被賦值的和手動賦值的重複了,TypeScript不會報錯,後者會覆蓋前者it
因此使用的時候須要注意,最好不要出現這種覆蓋的狀況io
手動賦值的枚舉項能夠不是數字,可是必需要使用類型斷言來人tsc無視類型檢查:console
enum Days {Sun=7, Mon, Tue, Wed, Thu, Fri=({ value: 123, text: 'Fri'} as any), Sat=('Sat' as any)};
若是手動賦值的是非數字的話,手動賦值的枚舉項後面也必須都要賦值,不然會報錯:編譯
enum Days {Sun=7, Mon, Tue, Wed, Thu, Fri=({ value: 123, text: 'Fri'} as any), Sat}; //Enum member must have initializer.
手動賦值也能夠是小數或者負數,後續爲賦值的項還是遞增長1引用
enum Days {Sun = 7, Mon = 1.5, Tue, Wed, Thu, Fri, Sat}; console.log(Days["Sun"] === 7); // true console.log(Days["Mon"] === 1.5); // true console.log(Days["Tue"] === 2.5); // true console.log(Days["Sat"] === 6.5); // true
枚舉項有兩種類型:常數項(constant member)和計算所得項(computed member)。方法
enum Color {Red, Green, Blue = 'blue'.length};
'blue'.length
就是計算所得項;
若是緊接着計算所得項後面是未手動賦值的項,那麼他就會由於沒法得到初始值而報錯:
enum Color {Red = 'red'.length, Green, Blue}; //Enum member must have initializer.
知足一下條件的枚舉成員被當作是常數:
枚舉成員使用常數枚舉表達式初始化;常數枚舉表達式是 TypeScript 表達式的子集,它能夠在編譯階段求值。當一個表達式知足下面條件之一時,它就是一個常數枚舉表達式:
+
, -
, ~
一元運算符應用於常數枚舉表達式+
, -
, *
, /
, %
, <<
, >>
, >>>
, &
, |
, ^
二元運算符,常數枚舉表達式作爲其一個操做對象。若常數枚舉表達式求值後爲 NaN 或 Infinity,則會在編譯階段報錯常數枚舉是使用 const enum
定義的枚舉類型:
const enum Directions { up, down, left, right }; let directions = [Directions.up,Directions.down,Directions.left,Directions.right]; //[0, 1, 2, 3]
與普通枚舉的區別是在編譯階段會被刪除,而且不能包含計算成員。
const enum Color {Red, Green, Blue = 'blue'.length}; //const enum member initializers can only contain literal values and other computed enum values.
外部枚舉用來描述已經存在的枚舉類型的形狀。
declare enum Directions { up, down, left, right }; let directions = [Directions.up,Directions.down,Directions.left,Directions.right];
declare
定義的類型只會用於編譯時的檢查,編譯結果中會被刪除。
外部枚舉和非外部枚舉之間有一個重要的區別,在正常的枚舉裏,沒有初始化方法的成員被當成常數成員。 對於很是數的外部枚舉而言,沒有初始化方法時被當作須要通過計算的。
外部枚舉與聲明語句同樣,常出如今聲明文件中。
同時使用 declare
和 const
也是能夠的:
declare const enum Directions { up, down, left, right }; let directions = [Directions.up,Directions.down,Directions.left,Directions.right]; //[0, 1, 2, 3]