TypeScriptでEnumの値が存在するかチェックする
JavaScriptでは、通常、switch
文や配列のindexOf()
メソッドを使用して値の存在を確認します。しかし、TypeScriptのenumは型安全性を提供するため、よりエレガントな方法があります。
in演算子を使用する
最も一般的な方法です。Enumの値がEnum型に存在するかどうかを直接チェックします。
enum Color {
Red,
Green,
Blue
}
function isColor(color: any): color is Color {
return color in Color;
}
const red = Color.Red;
const purple = "Purple";
console.log(isColor(red)); // true
console.log(isColor(purple)); // false
typeof演算子とenum型比較
Enumの型を直接比較する方法です。
function isColor(color: any): color is Color {
return typeof color === "number" && color in Color;
}
enumの値を配列に格納する
配列のincludes()
メソッドを使用する方法です。ただし、この方法はパフォーマンスが少し劣る場合があります。
const colors: Color[] = Object.values(Color);
function isColor(color: any): color is Color {
return colors.includes(color);
}
カスタム関数を作成する
より複雑な条件が必要な場合、カスタム関数を作成することができます。
function isColor(color: any): color is Color {
// カスタムロジックを追加
return typeof color === "number" && color >= Color.Red && color <= Color.Blue;
}
注意
in
演算子は、オブジェクトのプロパティをチェックする際に使用されますが、enum
の値もオブジェクトのプロパティとして扱われます。enum
の値は数値型であるため、数値型の変数に代入できます。
enum Color {
Red,
Green,
Blue
}
function isColor(color: any): color is Color {
return color in Color;
}
const red = Color.Red;
const purple = "Purple";
console.log(isColor(red)); // true
console.log(isColor(purple)); // false
Color in Color
:Color
の値がColor
オブジェクトのプロパティとして存在するかチェックします。
function isColor(color: any): color is Color {
return typeof color === "number" && color in Color;
}
color in Color
: さらに、color
がColor
の値であることを確認します。typeof color === "number"
:color
が数値型であることを確認します。
const colors: Color[] = Object.values(Color);
function isColor(color: any): color is Color {
return colors.includes(color);
}
colors.includes(color)
:color
がcolors
配列に含まれているかチェックします。Object.values(Color)
:Color
の値を配列として取得します。
function isColor(color: any): color is Color {
// カスタムロジックを追加
return typeof color === "number" && color >= Color.Red && color <= Color.Blue;
}
- カスタムロジック: 独自の条件を追加して、特定の範囲内の値のみを有効とすることができます。
enum Color {
Red,
Green,
Blue
}
function isColor(color: any): color is Color {
return color in Color;
}
const red = Color.Red;
const purple = "Purple";
console.log(isColor(red)); // true
console.log(isColor(purple)); // false
function isColor(color: any): color is Color {
return typeof color === "number" && color in Color;
}
const colors: Color[] = Object.values(Color);
function isColor(color: any): color is Color {
return colors.includes(color);
}
function isColor(color: any): color is Color {
// カスタムロジックを追加
return typeof color === "number" && color >= Color.Red && color <= Color.Blue;
}
TypeScriptの型ガード (Type Guard)
TypeScriptの型ガードを活用することで、より安全かつ明確なコードを書くことができます。
function isColor(color: any): color is Color {
return color in Color;
}
function getColorName(color: Color): string {
if (isColor(color)) {
switch (color) {
case Color.Red:
return "赤";
case Color.Green:
return "緑";
case Color.Blue:
return "青";
default:
return "未知の色";
}
} else {
throw new Error("無効な色です");
}
}
javascript typescript enums