Enum

Enum

Enumは、数値の定数に名前を付け、その集合に対する定義を可能にしたものです。 Enumはenumキーワードを使用して定義します。

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

Enumの本体は、ゼロ以上の数値のメンバーで構成されます。 Enumのメンバーはそれらに結びつく数値を持ち、定数または計算されたものが指定されます。 Enumのメンバーは、次の要件を満たせば定数であるとみなされます。

  • 初期化処理を持たず、それ以前のメンバーが定数である。

    このケースでは、その場所でのEnumメンバーの値は、前のEnumメンバーの値に1を加算した値になります。 このルールには1つ例外があり、それはEnumの先頭の要素です。 もし、これが初期化処理を持たなければ、0の値が割り当てられます。

  • EnumのメンバーがEnum定数式によって初期化される。

    Enum定数式はTypeScriptの式のサブセットであり、コンパイル時に評価されます。 下記のいずれかの場合、その式はEnumの定数式になります。

    • 数値リテラル
    • それ以前に定数として定義されたEnumのメンバーを参照する(異なるEnumでの定義も可能)。 もし、同じEnum内で定義されたメンバーであれば、無条件に(unqualified)名前を使用して参照することが可能。
    • 括弧に囲まれたEnumの定数式
    • +-~の単一演算子が割り当てられたEnumの定数式
    • +-*/%<<>>>>>&|^の二項演算子を含むEnum定数式。 評価されるEnum定数式がNaNまたはInfinityの場合は、コンパイル時にエラーになります。

これ以外の全てのケースは、Enumのメンバーは計算されたものであると判断されます。

enum FileAccess {
    // 定数メンバー
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // 計算されたメンバー
    G = "123".length
}

Enumはランタイム時に実際に存在するオブジェクトです。 それを裏付ける1つの理由は、Enumの値からEnumの名前へ、予約されたマッピングを保持する能力があることです。

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"

コンパイルされて生成されたEnumのコードは、「名前→値」と「値→名前」それぞれのマッピングを保持するオブジェクトになります。 Enumメンバーへの参照は、インラインでは無く、常にプロパティへのアクセスとなります。 これは多くのケースで完璧で適切な解決策と言えるでしょう。

ただし、時にはこれが窮屈になることがあるでしょう。 余計に生成されるコードへのコストの支払いと、Enumの値にアクセスする際の間接的な処理を避けるために、 Enum定数を使用することが可能です。 Enum定数は、const修飾子をenumキーワードの前に使用することで定義します。

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

Enum定数ではEnum定数式しか使用できず、通常のEnumとは異なり、 コンパイル中に完全に削除されます。

Enum定数のメンバーは使用時にはインライン化されます。 Enum定数が計算されるメンバーを持つことが出来ないために、これが可能となっています。

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

アンビエントEnum

アンビエント(Ambient)Enumは既に存在しているEnumの型の状況によって表されます。

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

アンビエントと非アンビエントのEnumの間で異なる1つの重要なことに、 通常のEnumの初期化処理を持たないメンバーは、定数メンバーとみなされるという点が挙げられます。 一方、非定数の初期化処理を持たないアンビエントEnumのメンバーは、計算されたメンバーであるとみなされます。

 Back to top

© https://github.com/Microsoft/TypeScript-Handbook

このページは、ページトップのリンク先のTypeScript-Handbook内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • ドキュメントの情報が古い可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。