跟隨handbook的腳步,詳細介紹一下枚舉。
enum Direction {
Up = 1, Down, Left, Right }
一個枚舉類型可以包含零個或多個枚舉成員,每個枚舉成員可以是一個常數,也可以是計算變量。
如果沒有初始化就會被當作常數,這是第一項為0,其余為前一項加一。
如果項具有ts表達式,在編譯的時候就會被計算出來。比如
enum FileAccess {
// constant members
None, Read = 1 << 1, Write = 1 << 2, ReadWrite = Read | Write // computed member G = "123".length }
當然,反向映射是木有問題的。
enum Enum {
A
}
let a = Enum.A; let nameOfA = Enum[Enum.A]; // "A"
它被編譯成:
var Enum;
(function (Enum) { Enum[Enum["A"] = 0] = "A"; })(Enum || (Enum = {})); var a = Enum.A; var nameOfA = Enum[Enum.A]; // "A"
常數枚舉
常數枚舉是在enum關鍵字前使用const修飾符
const enum Enum {
A = 1, B = A * 2 }
你編譯出來會看到js什么也沒有,是的,它是在編譯階段會被刪除,而且它和名字一樣只能使用常數表達式。(常數枚舉成員在使用的地方被內聯進來。 這是因為常數枚舉不可能有計算成員)。
const enum Enum {
A = 1*8, B = A * 2 } var re=Enum.A; console.log( re);
你會看到編譯出來是
var re = 8 /* A */;
console.log(re);
外部枚舉
外部枚舉就像這樣,用declare關鍵字定義
declare enum Enum {
A = 1, B, C = 2 }
引用中文book的話說:外部枚舉和非外部枚舉之間有一個重要的區別,在正常的枚舉里,沒有初始化方法的成員被當成常數成員。 對於非常數的外部枚舉而言,沒有初始化方法時被當做需要經過計算的。
declare enum Enum {
A = 1, B, C = 2 } var re=Enum.A; console.log( re);
如上的外部枚舉,編譯出來為
var re = Enum.A;
console.log(re);
