<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 枚舉 枚舉(Enum)類型用于取值被限定在一定范圍內的場景,比如一周只能有七天,顏色限定為紅綠藍等。 ## 簡單的例子 枚舉使用 `enum` 關鍵字來定義: ```ts enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; ``` 枚舉成員會被賦值為從 `0` 開始遞增的數字,同時也會對枚舉值到枚舉名進行反向映射: ```ts enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; console.log(Days["Sun"] === 0); // true console.log(Days["Mon"] === 1); // true console.log(Days["Tue"] === 2); // true console.log(Days["Sat"] === 6); // true console.log(Days[0] === "Sun"); // true console.log(Days[1] === "Mon"); // true console.log(Days[2] === "Tue"); // true console.log(Days[6] === "Sat"); // true ``` 事實上,上面的例子會被編譯為: ```js var Days; (function (Days) { Days[Days["Sun"] = 0] = "Sun"; Days[Days["Mon"] = 1] = "Mon"; Days[Days["Tue"] = 2] = "Tue"; Days[Days["Wed"] = 3] = "Wed"; Days[Days["Thu"] = 4] = "Thu"; Days[Days["Fri"] = 5] = "Fri"; Days[Days["Sat"] = 6] = "Sat"; })(Days || (Days = {})); ``` ## 手動賦值 我們也可以給枚舉項手動賦值: ```ts enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat}; console.log(Days["Sun"] === 7); // true console.log(Days["Mon"] === 1); // true console.log(Days["Tue"] === 2); // true console.log(Days["Sat"] === 6); // true ``` 上面的例子中,未手動賦值的枚舉項會接著上一個枚舉項遞增。 如果未手動賦值的枚舉項與手動賦值的重復了,TypeScript 是不會察覺到這一點的: ```ts enum Days {Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat}; console.log(Days["Sun"] === 3); // true console.log(Days["Wed"] === 3); // true console.log(Days[3] === "Sun"); // false console.log(Days[3] === "Wed"); // true ``` 上面的例子中,遞增到 `3` 的時候與前面的 `Sun` 的取值重復了,但是 TypeScript 并沒有報錯,導致 `Days[3]` 的值先是 `"Sun"`,而后又被 `"Wed"` 覆蓋了。編譯的結果是: ```js var Days; (function (Days) { Days[Days["Sun"] = 3] = "Sun"; Days[Days["Mon"] = 1] = "Mon"; Days[Days["Tue"] = 2] = "Tue"; Days[Days["Wed"] = 3] = "Wed"; Days[Days["Thu"] = 4] = "Thu"; Days[Days["Fri"] = 5] = "Fri"; Days[Days["Sat"] = 6] = "Sat"; })(Days || (Days = {})); ``` 所以使用的時候需要注意,最好不要出現這種覆蓋的情況。 手動賦值的枚舉項可以不是數字,此時需要使用類型斷言來讓 tsc 無視類型檢查 (編譯出的 js 仍然是可用的): ```ts enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri, Sat = <any>"S"}; ``` ```js var Days; (function (Days) { Days[Days["Sun"] = 7] = "Sun"; Days[Days["Mon"] = 8] = "Mon"; Days[Days["Tue"] = 9] = "Tue"; Days[Days["Wed"] = 10] = "Wed"; Days[Days["Thu"] = 11] = "Thu"; Days[Days["Fri"] = 12] = "Fri"; Days[Days["Sat"] = "S"] = "Sat"; })(Days || (Days = {})); ``` 當然,手動賦值的枚舉項也可以為小數或負數,此時后續未手動賦值的項的遞增步長仍為 `1`: ```ts 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)。 前面我們所舉的例子都是常數項,一個典型的計算所得項的例子: ```ts enum Color {Red, Green, Blue = "blue".length}; ``` 上面的例子中,`"blue".length` 就是一個計算所得項。 上面的例子不會報錯,但是**如果緊接在計算所得項后面的是未手動賦值的項,那么它就會因為無法獲得初始值而報錯**: ```ts 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. ``` 下面是常數項和計算所得項的完整定義,部分引用自[中文手冊 - 枚舉]: 當滿足以下條件時,枚舉成員被當作是常數: - 不具有初始化函數并且之前的枚舉成員是常數。在這種情況下,當前枚舉成員的值為上一個枚舉成員的值加 `1`。但第一個枚舉元素是個例外。如果它沒有初始化方法,那么它的初始值為 `0`。 - 枚舉成員使用常數枚舉表達式初始化。常數枚舉表達式是 TypeScript 表達式的子集,它可以在編譯階段求值。當一個表達式滿足下面條件之一時,它就是一個常數枚舉表達式: - 數字字面量 - 引用之前定義的常數枚舉成員(可以是在不同的枚舉類型中定義的)如果這個成員是在同一個枚舉類型中定義的,可以使用非限定名來引用 - 帶括號的常數枚舉表達式 - `+`, `-`, `~` 一元運算符應用于常數枚舉表達式 - `+`, `-`, `*`, `/`, `%`, `<<`, `>>`, `>>>`, `&`, `|`, `^` 二元運算符,常數枚舉表達式做為其一個操作對象。若常數枚舉表達式求值后為 NaN 或 Infinity,則會在編譯階段報錯 所有其它情況的枚舉成員被當作是需要計算得出的值。 ## 常數枚舉 常數枚舉是使用 `const enum` 定義的枚舉類型: ```ts const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; ``` 常數枚舉與普通枚舉的區別是,它會在編譯階段被刪除,并且不能包含計算成員。 上例的編譯結果是: ```js var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */]; ``` 假如包含了計算成員,則會在編譯階段報錯: ```ts 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` 定義的枚舉類型: ```ts declare enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; ``` 之前提到過,`declare` 定義的類型只會用于編譯時的檢查,編譯結果中會被刪除。 上例的編譯結果是: ```js var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; ``` 外部枚舉與聲明語句一樣,常出現在聲明文件中。 同時使用 `declare` 和 `const` 也是可以的: ```ts declare const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; ``` 編譯結果: ```js var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */]; ``` > TypeScript 的枚舉類型的概念[來源于 C#][C# Enum]。 ## 參考 - [Enums](http://www.typescriptlang.org/docs/handbook/enums.html)([中文版][中文手冊 - 枚舉]) - [C# Enum][] [中文手冊 - 枚舉]: https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/Enums.html [C# Enum]: https://msdn.microsoft.com/zh-cn/library/sbbt4032.aspx --- - [上一章:元組](tuple.md) - [下一章:類](class.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看