[TypeScript] 列挙型

はじめに

残念なことに JavaScript には列挙型がありません。

しかし TypeScript は C# や Java といった言語と同様に列挙型を使用することができます。

今回は、TypeScript における列挙型について説明します。

目次

列挙型とは

列挙型を使用すると、名前付きの定数のセットを宣言することができます。

例えば元号を表す定数として、Meiji, Taisho, Syouwa, Heisei, Reiwa のような文字列をまとめた定数のセットを作ることができます。

TypeScript では以下3つの種類の列挙型を定義することができます。

  1. Numeric Enum
  2. String Enum
  3. Heterogeneous Enum

列挙型の定義方法

Numeric Enum

Numeric Enum とは数値ベースの列挙型です。文字列の定数を列挙型として定義すると、自動的に0からの数値が割り当てられます。

Numeric Enumの定義書式を以下に示します。

enum 列挙型名 {
  定数名1,
  定数名2,
  :
  定数名n
}

元号、Meiji, Taisho, Syouwa, Heisei, Reiwaを Numeric Enum として定義する例を以下に示します。以下のように定義した場合は、Meiji=0, Taisho=1, Shouwa=2,Heisei=3,Reiwa=4 のように自動的に値が設定されます。

enum Gengo {
    Meiji,
    Taisho,
    Shouwa,
    Heisei,
    Reiwa
}

最初に振られる値を自分で設定するには以下のようにします。以下はMeiji = 1としており、以降は 2, 3, 4, 5 と自動的に振られます。

enum Gengo {
    Meiji = 1,
    Taisho,
    Shouwa,
    Heisei,
    Reiwa
}

定数に振る値は連続した値でなくても構いません。以下のように各定数にバラバラに値を振ることもできます。

enum Gengo {
    Meiji = 1,
    Taisho = 2,
    Shouwa = 4,
    Heisei = 8,
    Reiwa = 16
}

JavaScript は enum を持っていないため、トランスパイルすると以下のように変換されます。

// トランスパイルされた JavaScript のコード
var Gengo;
(function (Gengo) {
    Gengo[Gengo["Meiji"] = 1] = "Meiji";
    Gengo[Gengo["Taisho"] = 2] = "Taisho";
    Gengo[Gengo["Shouwa"] = 4] = "Shouwa";
    Gengo[Gengo["Heisei"] = 8] = "Heisei";
    Gengo[Gengo["Reiwa"] = 16] = "Reiwa";
})(Gengo || (Gengo = {}));

上記の他に、関数の戻り値を定数の値に設定したり、計算値を定数の値に設定することもできます。以下は定数 Shouwa の値に関数 getGengoValue の戻り値を設定しています。また、定数 Reiwa は定数 Shouwa の値に2を加算したものを設定しています。

enum Gengo {
    Meiji = 0,
    Taisho = 1,
    Shouwa = 2,
    Heisei = getGengoValue("Heisei"),
    Reiwa = Shouwa + 2
}

function getGengoValue(gengo : String) : number {
    let val = 0;
    switch(gengo) {
        case "Meiji":
            val = 0;
            break;
        case "Taisho":
            val = 1;
            break;
        case "Shouwa":
            val = 2;
            break;
        case "Heisei":
            val = 3;
            break;
        case "Reiwa":
            val = 4;
            break;
    }

    return val;
}

String Enum

Numeric Enum は数値を定数の値として設定しましたが、String Enum は文字列を定数の値として設定します。

以下に例を示します。

enum Gengo {
    Meiji = "明治",
    Taisho = "大正",
    Shouwa = "昭和",
    Heisei = "平成",
    Reiwa = "昭和"
}

Heterogeneous Enum

定数に設定する値は、数値と文字列を混在させることも可能です。

以下に例を示します。この例では Meiji と Taisho に数値を設定し、Shouwa, Heisei, Reiwa に文字列を設定しています。

enum Gengo {
    Meiji = 1,
    Taisho = 2,
    Shouwa = "昭和",
    Heisei = "平成",
    Reiwa = "昭和"
}

列挙型の使用方法

定義した列挙型は「列挙型名.定数」という書式で使用することができます。

例えば、列挙型 Gengo の Heisei の値をコンソールログに出力したい場合は以下のようにします。

enum Gengo {
    Meiji = 1,
    Taisho = 2,
    Shouwa = 3,
    Heisei = 4,
    Reiwa = 5
}

console.log(Gengo.Heisei);

列挙型の値は逆マッピングすることができます。逆マッピングはメンバー値とその値からメンバにアクセスすることを指します。

以下に例を示します。

enum Gengo {
    Meiji = 1,
    Taisho = 2,
    Shouwa = 3,
    Heisei = 4,
    Reiwa = 5
}

console.log(Gengo.Shouwa);    // 3 を出力 
console.log(Gengo[3])         // Shouwa を出力

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください