TypeScript で次の列挙型を定義しました。
enum Color{
Red, Green
}
私の関数では、色を文字列として受け取ります。次のコードを試しました:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
その値を列挙型に変換するにはどうすればよいですか?
TypeScript で次の列挙型を定義しました。
enum Color{
Red, Green
}
私の関数では、色を文字列として受け取ります。次のコードを試しました:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
その値を列挙型に変換するにはどうすればよいですか?
このメモは、元の質問ではなく、バサラトの回答に関連しています。
私自身のプロジェクトで、コンパイラが次のコードと同等のものを使用して「文字列を色に変換できません」とほぼ同等のエラーを出すという奇妙な問題がありました。
var colorId = myOtherObject.colorId; // value "Green";
var color: Color = <Color>Color[colorId]; // TSC error here: Cannot convert string to Color.
コンパイラの型推論が混乱していることがわかり、それcolorId
は ID ではなく列挙値であると考えられていました。問題を解決するには、ID を文字列としてキャストする必要がありました。
var colorId = <string>myOtherObject.colorId; // Force string value here
var color: Color = Color[colorId]; // Fixes lookup here.
問題の原因はわかりませんが、誰かが私と同じ問題に遭遇した場合に備えて、このメモをここに残しておきます.
TypeScript コンパイラが変数の型が文字列であることを認識している場合、これは機能します。
let colorName : string = "Green";
let color : Color = Color[colorName];
それ以外の場合は、明示的に文字列に変換する必要があります (コンパイラの警告を回避するため):
let colorName : any = "Green";
let color : Color = Color["" + colorName];
実行時には、両方のソリューションが機能します。
型をガードすることに興味がある場合は、それ以外の場合はstring
(これが私がこの問題に遭遇した方法です)、これがうまくいくかもしれません:
enum CurrencyCode {
cad = "cad",
eur = "eur",
gbp = "gbp",
jpy = "jpy",
usd = "usd",
}
const createEnumChecker = <T extends string, TEnumValue extends string>(
enumVariable: { [key in T]: TEnumValue }
) => {
const enumValues = Object.values(enumVariable);
return (value: string | number | boolean): value is TEnumValue =>
enumValues.includes(value);
};
const isCurrencyCode = createEnumChecker(CurrencyCode);
const input: string = 'gbp';
let verifiedCurrencyCode: CurrencyCode | null = null;
// verifiedCurrencyCode = input;
// ^ TypeError: Type 'string' is not assignable to type 'CurrencyCode | null'.
if (isCurrencyCode(input)) {
verifiedCurrencyCode = input; // No Type Error
}
解決策は、一般的な列挙型について説明しているこのgithub issueから取得されます