531

TypeScript で次の列挙型を定義しました。

enum Color{
    Red, Green
}

私の関数では、色を文字列として受け取ります。次のコードを試しました:

var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum

その値を列挙型に変換するにはどうすればよいですか?

4

26 に答える 26

31

このメモは、元の質問ではなく、バサラトの回答に関連しています。

私自身のプロジェクトで、コンパイラが次のコードと同等のものを使用して「文字列を色に変換できません」とほぼ同等のエラーを出すという奇妙な問題がありました。

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.

問題の原因はわかりませんが、誰かが私と同じ問題に遭遇した場合に備えて、このメモをここに残しておきます.

于 2013-12-17T12:54:31.763 に答える
17

TypeScript コンパイラが変数の型が文字列であることを認識している場合、これは機能します。

let colorName : string = "Green";
let color : Color = Color[colorName];

それ以外の場合は、明示的に文字列に変換する必要があります (コンパイラの警告を回避するため):

let colorName : any = "Green";
let color : Color = Color["" + colorName];

実行時には、両方のソリューションが機能します。

于 2016-08-17T06:37:15.550 に答える
3

型をガードすることに興味がある場合は、それ以外の場合は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から取得されます

于 2020-11-18T20:25:20.890 に答える