TypeScript Enum キー取得方法
TypeScriptでEnumの値からキーを取得する方法
TypeScriptにおけるEnumは、定数を定義するための便利な機能です。通常、キーと値のペアで定義されます。しかし、値からキーを取得したい場合もあります。
**Object.keys()とfind()**を使用する
この方法は、Enumをオブジェクトとして扱い、キーの配列から値に一致するキーを検索します。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
function getKeyByValue(enumName: any, value: any): string | undefined {
return Object.keys(enumName).find(key => enumName[key] === value);
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
for...inループを使用する
この方法は、Enumのキーを直接ループし、値を比較します。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
function getKeyByValue(enumName: any, value: any): string | undefined {
for (const key in enumName) {
if (enumName[key] === value) {
return key;
}
}
return undefined;
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
Mapを使用する
Enumのキーと値をMapに保存し、値からキーを取得します。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
const enumMap = new Map<string, number>();
for (const key in MyEnum) {
enumMap.set(key, MyEnum[key]);
}
function getKeyByValue(enumName: any, value: any): string | undefined {
return enumMap.get(value);
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
注意
- Mapを使用する場合、Enumの値が重複しないことを確認してください。
- Object.keys()やfor...inループを使用する場合、Enumのキーが数値の場合、文字列に変換されることに注意してください。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
function getKeyByValue(enumName: any, value: any): string | undefined {
return Object.keys(enumName).find(key => enumName[key] === value);
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
- find(key => enumName[key] === value): 配列から値に一致するキーを検索し、見つかった場合はキーを返します。
- Object.keys(enumName): Enumのキーを配列として取得します。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
function getKeyByValue(enumName: any, value: any): string | undefined {
for (const key in enumName) {
if (enumName[key] === value) {
return key;
}
}
return undefined;
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
- if (enumName[key] === value): 値が一致する場合はキーを返します。
- for (const key in enumName): Enumのキーをループします。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
const enumMap = new Map<string, number>();
for (const key in MyEnum) {
enumMap.set(key, MyEnum[key]);
}
function getKeyByValue(enumName: any, value: any): string | undefined {
return enumMap.get(value);
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
- enumMap.get(value): 値からキーを取得します。
- enumMap.set(key, MyEnum[key]): Enumのキーと値をマップに登録します。
- new Map<string, number>(): キーが文字列、値が数値のマップを作成します。
TypeScriptの型ガードを使用する
TypeScriptの型ガードを活用して、Enumの値が特定のEnumの値であるかどうかをチェックし、キーを取得することができます。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
function getKeyByValue<T extends number>(enumName: T, value: T): keyof T | undefined {
for (const key in enumName) {
if (enumName[key] === value) {
return key as keyof T;
}
}
return undefined;
}
const key = getKeyByValue(MyEnum, 2); // key will be "B"
TypeScriptの逆引き型を利用して、Enumの値から対応するキーを取得できます。
enum MyEnum {
A = 1,
B = 2,
C = 3
}
type MyEnumReverse = {
[K in keyof typeof MyEnum]: MyEnum[K];
};
function getKeyByValue(enumName: MyEnumReverse, value: MyEnum): keyof typeof MyEnum | undefined {
for (const key in enumName) {
if (enumName[key] === value) {
return key;
}
}
return undefined;
}
const key = getKeyByValue({ A: 1, B: 2, C: 3 }, 2); // key will be "B"
サードパーティライブラリを使用する
いくつかのサードパーティライブラリがEnumの値からキーを取得する機能を提供しています。例えば、ts-enum-util
ライブラリを使用することができます。
import { getEnumKeyByValue } from 'ts-enum-util';
enum MyEnum {
A = 1,
B = 2,
C = 3
}
const key = getEnumKeyByValue(MyEnum, 2); // key will be "B"
typescript enums