鍍金池/ 教程/ HTML/ 枚舉
初始化項目結(jié)構(gòu)
聯(lián)合類型
介紹
介紹
介紹
編譯選項
TypeScript 1.6
介紹
介紹
發(fā)展路線圖
介紹
在MSBuild里使用編譯選項
可迭代性
TypeScript 1.3
介紹
介紹
TypeScript 1.1
變量聲明
即將到來的Angular 2框架是使用TypeScript開發(fā)的。 因此Angular和TypeScript一起使用非常簡單方便
tsconfig.json
介紹
介紹
介紹
在MSBuild里使用編譯選項
使用TypeScript的每日構(gòu)建版本
新建工程
枚舉
三斜線指令
結(jié)合ASP.NET v5使用TypeScript
TypeScript里的this
介紹
TypeScript 1.4
編碼規(guī)范
介紹
模塊解析
ASP.NET 4
架構(gòu)概述
介紹
介紹
ASP.NET Core
TypeScript 1.8
介紹
介紹
創(chuàng)建簡單工程
TypeScript 1.7
TypeScript 1.5
NPM包的類型
支持TypeScript的編輯器

枚舉

使用枚舉我們可以定義一些有名字的數(shù)字常量。 枚舉通過enum關(guān)鍵字來定義。

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}

一個枚舉類型可以包含零個或多個枚舉成員。 枚舉成員具有一個數(shù)字值,它可以是常數(shù)或是計算得出的值 當(dāng)滿足如下條件時,枚舉成員被當(dāng)作是常數(shù):

  • 不具有初始化函數(shù)并且之前的枚舉成員是常數(shù)。 在這種情況下,當(dāng)前枚舉成員的值為上一個枚舉成員的值加1。 但第一個枚舉元素是個例外。 如果它沒有初始化方法,那么它的初始值為0。
  • 枚舉成員使用常數(shù)枚舉表達式初始化。 常數(shù)枚舉表達式是TypeScript表達式的子集,它可以在編譯階段求值。 當(dāng)一個表達式滿足下面條件之一時,它就是一個常數(shù)枚舉表達式:
    • 數(shù)字字面量
    • 引用之前定義的常數(shù)枚舉成員(可以是在不同的枚舉類型中定義的) 如果這個成員是在同一個枚舉類型中定義的,可以使用非限定名來引用。
    • 帶括號的常數(shù)枚舉表達式
    • +, -, ~ 一元運算符應(yīng)用于常數(shù)枚舉表達式
    • +, -, *, /, %, <<, >>, >>>, &, |, ^ 二元運算符,常數(shù)枚舉表達式做為其一個操作對象 若常數(shù)枚舉表達式求值后為NaNInfinity,則會在編譯階段報錯。

所有其它情況的枚舉成員被當(dāng)作是需要計算得出的值。

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"

生成的代碼中,枚舉類型被編譯成一個對象,它包含雙向映射(name -> value)和(value -> name)。 引用枚舉成員總會生成一次屬性訪問并且永遠不會內(nèi)聯(lián)。 在大多數(shù)情況下這是很好的并且正確的解決方案。 然而有時候需求卻比較嚴(yán)格。 當(dāng)訪問枚舉值時,為了避免生成多余的代碼和間接引用,可以使用常數(shù)枚舉。 常數(shù)枚舉是在enum關(guān)鍵字前使用const修飾符。

const enum Enum {
    A = 1,
    B = A * 2
}

常數(shù)枚舉只能使用常數(shù)枚舉表達式并且不同于常規(guī)的枚舉的是它們在編譯階段會被刪除。 常數(shù)枚舉成員在使用的地方被內(nèi)聯(lián)進來。 這是因為常數(shù)枚舉不可能有計算成員。

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 */];

外部枚舉

外部枚舉用來描述已經(jīng)存在的枚舉類型的形狀。

declare enum Enum {
    A = 1,
    B,
    C = 2
}

外部枚舉和非外部枚舉之間有一個重要的區(qū)別,在正常的枚舉里,沒有初始化方法的成員被當(dāng)成常數(shù)成員。 對于非常數(shù)的外部枚舉而言,沒有初始化方法時被當(dāng)做需要經(jīng)過計算的。