enum Color {Red = "red".length, Green, Blue};
// index.ts(1,33): error TS1061: Enum member must have initializer.
// index.ts(1,40): error TS1061: Enum member must have initializer.
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 */];
假如包含了計算成員,則會在編譯階段報錯:
const enum Color {Red, Green, Blue = "blue".length};
// index.ts(1,38): error TS2474: In 'const' enum declarations member initializer must be constant expression.
外部列舉
外部列舉(Ambient Enums)是使用 declare enum 定義的列舉型別:
declare enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
之前提到過,declare 定義的型別只會用於編譯時的檢查,編譯結果中會被刪除。
上例的編譯結果是:
var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
外部列舉與宣告語句一樣,常出現在宣告檔案中。
同時使用 declare 和 const 也是可以的:
declare 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 */];