TypeScriptの強力な機能のひとつに「列挙型(enum)」があります。
enumは一見すると単純な機能に思えますが、適切に使いこなせば、コードの可読性を向上させ、バグを減らすことができます。
本記事では、enumの基本と応用的な活用方法を紹介します。
目次
enum とは
列挙型(enum)は、enumerationの略で、一連の定義済みの値(定数)に名前を付けた型です。enumを使うことで、意味のある名前をつけた定数を扱いやすくなり、コードの意図を明確にすることができます。
基本的な書き方
以下の例は、日曜日から土曜日までの曜日を列挙型 Week として定義しています。
enum Week {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
// 使用例
const today: Week = Week.Wednesday;
console.log(today); // 出力: 3
TypeScriptでは、数値ベースと文字列ベースのenumを利用できます。
数値ベースのenum
数値ベースのEnumはデフォルトの動作であり、値に何も設定しなければ0から始まり、1ずつ増加します。
また、以下の例のようにカスタム値を設定することも可能です。
enum Role {
Admin = 1,
User,
Guest
}
console.log(Role.Admin); // 出力: 1
console.log(Role.User); // 出力: 2
console.log(Role.Guest); // 出力: 3
文字列ベースのenum
文字列ベースのenumでは、各値にカスタム文字列を割り当てることができます。
enum Direction {
Up = "上",
Down = "下",
Left = "左",
Right = "右"
}
console.log(Direction.Up); // 出力: "上"
enumの応用例
フラグとしての利用
ビット演算を活用して、enumをフラグとして扱うこともできます。
enum Permission {
Read = 1, // 2進数で0001
Write = 2, // 2進数で0010
Execute = 4 // 2進数で0100
}
const userPermission = Permission.Read | Permission.Write; // 0001と0010のORで0011
console.log(userPermission & Permission.Read); // 出力: 1 (Read権限を持つ)
console.log(userPermission & Permission.Execute); // 出力: 0 (Execute権限はない)
ビット演算の補足解説
| Permission.Read | Permission.Write ReadとWriteのいずれかのビットが1ならば1が立つ | 0001 0010 —— 0011 |
| userPermission & Permission.Read 上記の結果(0011)とReadの両方が1のビットのみ1が立つ | 0011 0001 —— 0001 |
| userPermission & Permission.Execute 上記の結果(0011)とExecuteの両方が1のビットのみ1が立つ | 0011 0100 —— 0000 |
キーと値の双方向性
数値ベースのenumは、キーと値の両方向で利用可能です。
キーから値を取得するにはドット(.)を使用し、値からキーを取得するには角カッコ([]) を使用します。
enum Color {
Red = 1,
Green,
Blue
}
console.log(Color.Red); // 出力: 1
console.log(Color[1]); // 出力: "Red"
console.log(Color[3]); // 出力: "Blue"
Key:Value形式のデータでは、キー(Key)から値(Value)を取得できるのはごく一般的かと思いますが、値の方からキーを取れるのは少々珍しい性質ですね。
まとめ
列挙型(enum)は、TypeScriptで定数値を効率的に扱うための大変便利なツールです。
特にコードの意図を明確にし、バグを防ぐ助けとなります。
本記事では基本的な使い方から応用的な利用法までを紹介しましたが、enumを適切に使いこなすことで、より強力で保守性の高いコードを書くことができます。
ぜひ、日常の開発にも積極的に取り入れてみていただければと思います。
本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。
それでは最後までお読みいただき、ありがとうございました。

コメント