enum
| 対応: | TypeScript 1.0(2014) |
|---|
関連する定数をグループにまとめる型です。数値や文字列に意味のある名前を付けて扱えます。
構文
// 数値enum: 自動的に0から連番が割り当てられます。
enum 列挙名 {
メンバー1, // 0
メンバー2, // 1
メンバー3, // 2
}
// 文字列enum: 各メンバーに明示的に文字列値を設定します。
enum 列挙名 {
メンバー1 = "値1",
メンバー2 = "値2",
}
// const enum: コンパイル時にインライン展開される最適化版です。
const enum 列挙名 {
メンバー1,
メンバー2,
}
構文一覧
| 構文 | 概要 |
|---|---|
| enum 名前 { ... } | 列挙型を定義します。デフォルトは数値enumで、0から順番に値が割り当てられます。 |
| 数値enum | メンバーに数値が割り当てられます。自動採番のほか、任意の開始値も設定できます。 |
| 文字列enum | メンバーに文字列を割り当てます。デバッグ時に値がそのまま文字列で見えるため、実務での使用が推奨されます。 |
| const enum | コンパイル後にJavaScriptの出力がなく、使用箇所に値が直接埋め込まれます。パフォーマンスに有利です。 |
サンプルコード
// 数値enum: 0から自動で番号が振られます。
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right, // 3
}
let move: Direction = Direction.Up;
console.log(move); // 0と出力されます。
console.log(Direction[0]); // 『Up』と出力されます(逆引きが可能です)。
// 開始値を指定することもできます。
enum HttpStatus {
OK = 200,
NotFound = 404,
InternalServerError = 500,
}
console.log(HttpStatus.OK); // 200と出力されます。
// 文字列enum: デバッグで値がそのまま見えるため便利です。
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE",
}
let favorite: Color = Color.Green;
console.log(favorite); // 『GREEN』と出力されます。
// switch文でenumを使うと意図が明確になります。
function getLabel(status: HttpStatus): string {
switch (status) {
case HttpStatus.OK: return "成功";
case HttpStatus.NotFound: return "見つかりません";
case HttpStatus.InternalServerError: return "サーバーエラー";
}
}
console.log(getLabel(HttpStatus.NotFound)); // 『見つかりません』と出力されます。
// const enum: コンパイル後に値が直接埋め込まれます。
const enum Size {
Small = "S",
Medium = "M",
Large = "L",
}
let tshirt: Size = Size.Medium; // コンパイル後は let tshirt = "M"; になります。
console.log(tshirt); // 『M』と出力されます。
実行すると次のように出力されます。
npx ts-node ts_enum.ts 0 Up 200 GREEN 見つかりません M
概要
『enum』は関連する定数値をひとまとめにして、読みやすい名前でアクセスできるようにする機能です。たとえば、ゲームの方向キーを`0, 1, 2, 3`と管理するより`Direction.Up, Direction.Down`と書けば、コードの意図が一目で分かります。
数値enumはリバースマッピング(`Direction[0]` で `"Up"` が取得できる機能)を持ちますが、文字列enumにはこの機能がありません。代わりに、デバッグ時にログに出力される値がそのまま意味のある文字列になるため、実務では文字列enumの使用が推奨されることが多いです。
注意: enumはTypeScript固有の機能で、コンパイル後にJavaScriptのオブジェクトとして出力されます。バンドルサイズを気にする場合は、代わりにas constを使ったオブジェクトリテラル(リテラル型を参照)が選ばれることもあります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。