TypeScriptでEnumを使いこなす:キーと値の取得・操作のベストプラクティス
TypeScript で Enum の値からキーを取得する方法
typeof 演算子を使用する
TypeScript 2.4 以降では、typeof
演算子を使用して Enum からキーを取得することができます。これは、次のような構文で実現できます。
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
const colorValue = 1; // 緑を表す値を取得
const colorName: keyof Color = typeof Color[colorValue]; // "Green" というキーを取得
この方法では、typeof
演算子を使用して Enum 型そのものを取得し、そのインデクサブル型を利用して、値をキーとしてアクセスします。
逆引き用の関数を作成する
別の方法として、Enum の値からキーを取得するための逆引き関数を作成する方法があります。これは、次のようなコードで実現できます。
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
function getEnumKeyByValue(value: number): keyof Color | undefined {
for (const key in Color) {
if (Color[key] === value) {
return key;
}
}
return undefined;
}
const colorValue = 1; // 緑を表す値を取得
const colorName = getEnumKeyByValue(colorValue); // "Green" というキーを取得
この方法では、すべての Enum メンバーをループし、値と一致するキーを検索します。この方法は、typeof
演算子を使用する方法よりも柔軟性がありますが、パフォーマンスが少し低下する可能性があります。
注意点
上記の方法を使用する際には、以下の点に注意する必要があります。
- Enum の値は、一意である必要があります。同じ値を持つ複数のメンバーがあると、どちらのキーが返されるかわかりません。
- TypeScript バージョン 2.4 より前の場合は、
typeof
演算子を使用する方法で使用できません。
TypeScript で Enum の値からキーを取得するには、typeof
演算子を使用する方法と、逆引き用の関数を作成する方法の 2 つの主要な方法があります。どちらの方法を使用するかは、状況と好みによって異なります。
TypeScript で Enum の値からキーを取得する:サンプルコード
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
const colorValue = 1; // 緑を表す値を取得
const colorName: keyof Color = typeof Color[colorValue]; // "Green" というキーを取得
console.log(colorName); // "Green" と出力
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
function getEnumKeyByValue(value: number): keyof Color | undefined {
for (const key in Color) {
if (Color[key] === value) {
return key;
}
}
return undefined;
}
const colorValue = 1; // 緑を表す値を取得
const colorName = getEnumKeyByValue(colorValue); // "Green" というキーを取得
console.log(colorName); // "Green" と出力
このサンプルコードでは、Color という Enum を定義し、その値からキーを取得する方法を 2 通り示しています。 1 つ目の方法は typeof
演算子を使用する方法で、2 つ目の方法は逆引き用の関数を作成する方法です。
補足
- このサンプルコードは、TypeScript Playground で実行して試すことができます。
- Enum の値は、ご自身の用途に合わせて変更してください。
TypeScript で Enum の値からキーを取得する:その他の方法
Object.keys()
メソッドを使用して、Enum のすべてのキーを取得し、その中に目的の値を持つキーを検索することができます。この方法は、次のようなコードで実現できます。
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
const colorValue = 1; // 緑を表す値を取得
const colorName = Object.keys(Color).find(key => Color[key] === colorValue);
if (colorName) {
console.log(colorName); // "Green" と出力
} else {
console.error("一致するキーが見つかりませんでした。");
}
この方法は、すべての Enum キーをループするため、パフォーマンスが少し低下する可能性があります。
switch
文を使用して、Enum の値と一致するキーを検索することができます。この方法は、次のようなコードで実現できます。
enum Color {
Red = 0,
Green = 1,
Blue = 2
}
const colorValue = 1; // 緑を表す値を取得
let colorName: keyof Color;
switch (colorValue) {
case Color.Red:
colorName = "Red";
break;
case Color.Green:
colorName = "Green";
break;
case Color.Blue:
colorName = "Blue";
break;
default:
colorName = undefined;
}
if (colorName) {
console.log(colorName); // "Green" と出力
} else {
console.error("一致するキーが見つかりませんでした。");
}
この方法は、一致するキーが見つかった場合のみコードが実行されるため、パフォーマンスが優れています。ただし、すべての Enum メンバーを列挙する必要があるため、コードが煩雑になる可能性があります。
カスタムロジックを使用する
上記のいずれの方法も適していない場合は、独自のロジックを使用して Enum の値からキーを取得することができます。これは、複雑な Enum や、特殊な要件がある場合に役立ちます。
上記の方法はあくまでも例であり、他にもさまざまな方法が考えられます。最適な方法は、具体的な状況に合わせて選択してください。
typescript enums