枚舉
在 TS 中可以通過枚舉定義一些帶名字的常量。
數字枚舉
enum Driection {
Up = 1,
Down,
Left,
Right
}
這段代碼定義了一個名爲 Direction 的枚舉,其中 Up 初始值爲1,則其他成員會依次遞增 2 3 4。
需要注意的是,如果不給成員初始化,默認會從1開始遞增。
使用枚舉:
enum Response {
No = 0,
Yes = 1
}
console.log(Response.Yes) // 輸出 0
字符串枚舉
不同於數字枚舉的自動遞增初始化,字符串枚舉需要自行初始化成員的值。
例如:
enum Direction {
Up = "UP",
Down = "DOWN",
LEFT = "LEFT",
Right = "RIGHT"
}
異構枚舉
即枚舉內部可以混合使用字符串和數字成員。
例如:
enum StringAndNumber {
No = 0,
Yes = "YES"
}
計算和常量成員
計算和常量成員是指在一定情況下,枚舉會對成員進行一定的計算初始化過程。
例如:
enum InitData {
initData
}
// 此時initData會初始化爲0
還有一些其他情況,這裏就不一一列舉,有興趣的同學可以去官網閱讀
聯合枚舉與枚舉成員
字面枚舉成員就是一種特殊的非計算的常量枚舉成員的子集。
字面枚舉成員指不帶有初始值的常量枚舉成員,或被初始化爲:任何字符串字面量、任何數字字面量、應用了一元-符號的數字字面量。
- 使用枚舉作爲類型。
enum ShapeKind {
Circle, Square
}
interface Circle {
kind: ShapeKind.Circle;
radius: number
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapedKind.Square, // 報錯,因爲定義的Circle是指定了ShapeKind.Circle的值而不是ShapeKind.Square的值
radius: 100
}
運行時的枚舉
枚舉也是一個對象。
例如:
enum E {
X, Y, Z
}
function fn(obj: { X: number })
fn(E) // fn函數的類型檢測會通過 因爲E.X是numebr
反向映射
枚舉不僅提供了可以獲取枚舉的值,還可以通過賦值獲取枚舉的成員的名稱。
例如:
enum Enum {
A
}
let a = Enum.A
let nameOfA = Enum[a] // 此時nameOfA爲A
const枚舉
即用 const 關鍵字聲明枚舉。
例如:
const enum A {
A
}
外部枚舉
外部枚舉用於描述已存在的枚舉類型的形狀,而外部枚舉和內部枚舉的一個重要區別就是,在正常的枚舉裏,沒有初始化的成員會被當成常數成員,對於非常數的外部枚舉而言,沒有初始化方法時被當作需要計算的成員。
例如:
declare enum Enum {
A = 1,
B,
C = 2
}