TypeScript 文字列enum変換方法
TypeScriptで文字列をenumに変換する方法
TypeScriptでは、文字列をenumに変換するための組み込みの関数はありません。しかし、いくつかのアプローチを使用してこれを達成することができます。
手動マッピング
最も直接的な方法は、文字列とenum値を手動でマッピングすることです。
enum MyEnum {
Value1 = "value1",
Value2 = "value2"
}
function stringToEnum(str: string): MyEnum | undefined {
return MyEnum[str as keyof typeof MyEnum];
}
const enumValue = stringToEnum("value1"); // MyEnum.Value1
オブジェクトリテラル
オブジェクトリテラルを使用して、文字列とenum値のペアを定義し、検索することができます。
const enumMap = {
value1: MyEnum.Value1,
value2: MyEnum.Value2
};
function stringToEnum(str: string): MyEnum | undefined {
return enumMap[str];
}
カスタム関数
より複雑な変換ロジックが必要な場合は、カスタム関数を作成することができます。
function stringToEnum<T>(str: string, enumObj: T): T[keyof T] | undefined {
return enumObj[str as keyof T];
}
const enumValue = stringToEnum("value1", MyEnum);
サードパーティライブラリ
特定のユースケースに合わせて、サードパーティライブラリを使用することもできます。これらのライブラリは、より高度な変換機能を提供する場合があります。
注意
- 存在しない文字列
文字列がenumに存在しない場合、関数はundefined
を返します。適切なエラー処理を実装してください。 - 大文字と小文字の区別
enum値と文字列は、大文字と小文字の区別が重要です。
enum MyEnum {
Value1 = "value1",
Value2 = "value2"
}
function stringToEnum(str: string): MyEnum | undefined {
return MyEnum[str as keyof typeof MyEnum];
}
const enumValue = stringToEnum("value1"); // MyEnum.Value1
解説
MyEnum[str as keyof typeof MyEnum]
で、文字列をenumのキーとして使用し、対応するenum値を取得します。stringToEnum
関数は、受け取った文字列をenum値に変換します。MyEnum
というenumを定義します。
const enumMap = {
value1: MyEnum.Value1,
value2: MyEnum.Value2
};
function stringToEnum(str: string): MyEnum | undefined {
return enumMap[str];
}
stringToEnum
関数は、文字列をキーとして使用して、対応するenum値を取得します。enumMap
オブジェクトに、文字列とenum値のペアを定義します。
function stringToEnum<T>(str: string, enumObj: T): T[keyof T] | undefined {
return enumObj[str as keyof T];
}
const enumValue = stringToEnum("value1", MyEnum);
stringToEnum
関数は、ジェネリック型を使用して、任意のenum型を受け取ることができます。
サードパーティライブラリを使用することもできますが、基本的な変換には上記のメソッドが十分です。
- 適切なエラー処理を実装してください。
- 文字列がenumに存在しない場合は、関数は
undefined
を返します。 - 文字列とenum値は大文字と小文字の区別があります。
マップ関数
const enumMap = {
value1: MyEnum.Value1,
value2: MyEnum.Value2
};
function stringToEnum(str: string): MyEnum | undefined {
return Object.entries(enumMap).find(([key, value]) => key === str)?.[1];
}
- 一致するエントリが見つかった場合は、その値を返します。
enumMap
オブジェクトをエントリに変換し、find
関数を使用して文字列と一致するエントリを検索します。
reduce関数
const enumMap = {
value1: MyEnum.Value1,
value2: MyEnum.Value2
};
function stringToEnum(str: string): MyEnum | undefined {
return Object.entries(enumMap).reduce((acc, [key, value]) => (key === str ? value : acc), undefined);
}
switch文
function stringToEnum(str: string): MyEnum | undefined {
switch (str) {
case "value1":
return MyEnum.Value1;
case "value2":
return MyEnum.Value2;
default:
return undefined;
}
}
switch
文を使用して、文字列と対応するenum値を比較します。
- @types/lodash-esなどのサードパーティライブラリを使用することもできます。
- 最適な方法は、プロジェクトの要件やコーディングスタイルに応じて選択してください。
- これらの代替方法は、それぞれ異なるアプローチを使用していますが、基本的には同じ目的を達成します。
typescript