はじめに
残念なことに JavaScript には列挙型がありません。
しかし TypeScript は C# や Java といった言語と同様に列挙型を使用することができます。
今回は、TypeScript における列挙型について説明します。
目次
列挙型とは
列挙型を使用すると、名前付きの定数のセットを宣言することができます。
例えば元号を表す定数として、Meiji, Taisho, Syouwa, Heisei, Reiwa のような文字列をまとめた定数のセットを作ることができます。
TypeScript では以下3つの種類の列挙型を定義することができます。
- Numeric Enum
- String Enum
- 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 を出力
コメント