TypeScript 列舉enum

admin發表於2018-08-11

通過列舉可以給數字以更加易懂的名字;使用enum定義。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red,
  yellow
}

以上程式碼宣告一個列舉型別,具有三個成員;預設情況下,從0開始為元素編號,並且依次遞增1。

也可以手動指定列舉成員的值,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue=2,
  red=3,
  yellow=5
}

上面程式碼對成員全部手動指定值,也可以部分指定,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue=2,
  red,
  yellow=5
}

blue後面的值,也會依次遞增1,直至手動指定成員。

可以由列舉值得到列舉成員的名字,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red,
  yellow
}
let colorName: string = Color[2];//colorName值是yellow

雖然列舉是數字命名,但是不同的列舉型別之間賦值是不允許的,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/11/001106hkmnnpzkavkpk8ai.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

特別說明:TypeScript 2.4支援列舉成員變數包含字串,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  Red = "RED",
  Green = "GREEN",
  Blue = "BLUE",
}

字串列舉成員不能被反向對映到列舉成員的名字。

列舉成員的值:

一個列舉型別可以包含零個或多個列舉成員。 

列舉成員具有一個數字值,可以是常數或是計算得出的值 當滿足如下條件時,列舉成員被當作是常數:

(1).沒有初始化的成員,且之前的列舉成員值是常數,程式碼如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue=1,
  red,
  yellow
}

red沒有初始化,但是它前面的成員值是常數1,所以它的值也是常數(遞增1)。

第一個列舉成員如果沒有初始化,那麼它的預設值是0。

(2).列舉成員值是常數表示式,滿足以下條件之一即可認為是常數列舉表示式:

數字字面量:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=2,
  yellow
}

2是一個數字字面量,是一個常數列舉表示式。

引用已定義的常數列舉成員:

使用已經定義的常數列舉成員的值初始化,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=2,
  yellow=red
}

在同一個列舉型別中定義的,無需使用限定名,再來看一段程式碼例項:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=2,
  yellow
}
enum Antzone{
  webName,
  address,
  age=Color.red
}

不同的列舉型別,引用則需要使用限定名。

帶括號的常數列舉表示式:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=(2),
  yellow
}

+, -, ~ 一元運算子應用於常數列舉表示式:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=+2,
  yellow
}

+, -, *, /, %, <<, >>, >>>, &, |, ^ 二元運算子:

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue,
  red=1+2,
  yellow
}

常數列舉表示式做為其一個操作物件,若常數列舉表示式求值後為 NaN或Infinity,則會在編譯階段報錯。

[typescript] 純文字檢視 複製程式碼
enum Color {
  blue="螞蟻部落".length
}

blue的值就是計算得出的值。

常數列舉:

在enum關鍵字前使用const修飾符,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
const enum Color {
  blue,
  red,
  yellow
}

常數列舉只能使用常數列舉表示式並且不同於常規的列舉的是它們在編譯階段會被刪除。 常數列舉成員在使用的地方被內聯進來。 這是因為常數列舉不可能有計算成員,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
const enum Color {
  blue,
  red,
  yellow
}
let colorArray = [Color.blue, Color.red, Color.yellow]

上面程式碼編譯後截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/11/001114ddvz40q7ev6zz3b6.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

外部列舉:

外部列舉用來描述已經存在的列舉型別的形狀,程式碼如下:

[typescript] 純文字檢視 複製程式碼
declare enum Enum {
    A = 1,
    B,
    C = 2
}

外部列舉和非外部列舉之間有一個重要的區別,在正常的列舉裡,沒有初始化方法的成員被當成常數成員。 對於非常數的外部列舉而言,沒有初始化方法時被當做需要經過計算的。

相關文章