TypeScript枚舉

枚舉

枚舉(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.

知足一下條件的枚舉成員被當作是常數:

  • 沒有初始化函數而且以前的枚舉成員是常數;這種狀況下當前枚舉成員的值是上一個成員+1;第一個枚舉成員若是沒有初始化,那麼他的初始值爲0
  • 枚舉成員使用常數枚舉表達式初始化;常數枚舉表達式是 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 定義的類型只會用於編譯時的檢查,編譯結果中會被刪除。

外部枚舉和非外部枚舉之間有一個重要的區別,在正常的枚舉裏,沒有初始化方法的成員被當成常數成員。 對於很是數的外部枚舉而言,沒有初始化方法時被當作須要通過計算的。

外部枚舉與聲明語句同樣,常出如今聲明文件中。

同時使用 declareconst 也是能夠的:

declare const enum Directions { up, down, left, right };
let directions = [Directions.up,Directions.down,Directions.left,Directions.right];
//[0, 1, 2, 3]
相關文章
相關標籤/搜索