enum
データ型を持っていますが、JavaScriptはありません。しかし、TypeScriptにはあります。TypeScript列挙型の定義例を次に示します。number
なので、私は数値列挙型(Number Enums)と呼んでいます。number
と互換性のあるものもそうです。Tristate[Tristate["False"] = 0] = "False";
という行に焦点を当てましょう。Tristate["False"] = 0
は自己説明的でなければなりません。つまり、Tristate
変数の"False"
メンバを0
に設定します。JavaScriptでは、代入演算子は割り当てられた値(この場合は0
)を返します。したがって、JavaScriptランタイムによって次に実行されるのは、Tristate[0] = "False"
です。これは、Tristate
変数を使用して、列挙型の文字列バージョンを列挙型の数値または数値バージョンに変換することができることを意味します。これは以下のとおりです:ヒント:私はいつも最初の列挙型を= 1
で初期化することによって、列挙型の値を安全にtruthyチェックできるようにします。
|
(or)/&
(and)/~
(not)は、ビットフラグを使って作業するときの友達です。|=
を使ってフラグを追加する&=
と~
の組み合わせを使ってフラグをクリアする|
を使ってフラグを組み合わせる注:フラグを組み合わせて、列挙型定義内の便利なショートカットを作成することができます。EndangeredFlyingClawedFishEating
は以下のようになります:
number
のenumを見てきました。実際には文字列値を持つ列挙型メンバを持つこともできます。例えばvar lie = Tristate.False
という行はJavaScriptのvar lie = Tristate.False
にコンパイルされます(出力は入力と同じです)。つまり、実行時にランタイムは Tristate
とTristate.False
を検索する必要があります。ここでパフォーマンスを向上させるには、enum
をconst enum
としてマークできます。これは以下のとおりです:Tristate.False
ではなく0
)Tristate
変数はありません)。使用箇所はインライン展開される--preserveConstEnums
(Const enum preserveConstEnums)Tristate
変数がないという事実は、実行時に実際には使用されないJavaScriptを生成しないことによって、コンパイラを助けることです。しかし、それでも先程のように数値型と文字列型を相互に検索できる列挙型を生成したい場合があるかもしれません。この場合、コンパイラフラグ--preserveConstEnums
を使用することができます。またvar Tristate
定義を生成するので、実行時にTristate["False"]
やTristate[0]
を手動で使用することができます。これはインライン展開には決して影響しません。enum
とnamespace
を合体させて、静的メソッドを列挙型に追加することができます。以下は、静的メンバisBusinessDay
を列挙型Weekday
に追加する例を示しています:注:オープンエンドの列挙型は、モジュールを使用していない場合にのみ関係します。モジュールを使用するべきです。したがって、このセクションで触れるだけに留めます。
Tristate[Tristate["False"] = 0] = "False";
部分については、すでに説明しました。今は、(function (Tristate) { /*code here */ })(Tristate || (Tristate = {}));
部分を見ましょう。特に(Tristate || (Tristate = {}));
。これは、基本的に既に捕捉されたローカル変数Tristate
を指し示すか、新しい空のオブジェクト{}
で初期化するローカル変数TriState
を取得します。Color
の定義を2つのブロックに分割しています0
、1
、...)を除外するために、列挙の最初のメンバ(ここではDarkRed = 3
)を再初期化しないといけないことです。それを行わない場合は、TypeScriptは警告します(エラーメッセージ:In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
)。