2016-10-28 14 views
0

"orange","apple"または"banana"のいずれかのAPIに由来する値があります。文字列ベースの列挙型をシミュレートする方法

だから最初に私がしたようなタイプを作成:

type Fruit = "orange" | "apple" | "banana";

それでは、私はFruitとしてAPIから値を入力することができます。

type Fruit = "orange" | "apple" | "banana"; 

function getFruitFromApi(): Fruit { 
    // simulating random result 
    const fruits: Fruit[] = ["orange", "apple", "banana"]; 

    return fruits[Math.floor(Math.random() * 3)]; 
} 

const fruit: Fruit = getFruitFromApi(); 

switch (fruit) { 
    case "orange": break; 
    case "apple": break; 
    case "banana": break; 
} 

これは問題ありませんが、スイッチにこれらの文字列を手動で入力する必要はありません。 Fruit.OrangeFruit.AppleFruit.Bananaのようなものがあります。基本的に列挙型のようですが、数値ではなく文字列と一致する値があります。

答えて

3

質問:私たちは、次の操作を行うことができ、後にTS 1.8またはで https://stackoverflow.com/a/35257367/105937

type Fruit = "orange" | "apple" | "banana"; 

const Fruit = { 
    Orange: "orange" as Fruit, 
    Apple: "apple" as Fruit, 
    Banana: "banana" as Fruit 
}; 

に解決されるFruit.Orangeとして使用します。

0

enumの値を指定することはできますが、数値でない場合はコンパイラはそれを好まないでしょう。
あなたはコンパイルエラーを取り除くためにanyにキャストすることができます

enum Fruit { 
    Orange = "orange" as any, 
    Apple = "apple" as any, 
    Banana = "banana" as any 
} 

function getFruitFromApi(): Fruit { 
    const fruits = ["orange", "apple", "banana"]; 

    return fruits[Math.floor(Math.random() * 3)] as any; 
} 

別のオプションは、定期的に列挙型を使用し、その列挙の中に受信した文字列を変換することです:この古いから答えを取る

enum Fruit { 
    Orange, 
    Apple, 
    Banana 
} 

function getFruitFromApi(): Fruit { 
    const fruits = ["orange", "apple", "banana"]; 
    const fruit = fruits[Math.floor(Math.random() * 3)]; 

    for (var key in Fruit) { 
     if (typeof key === "string" && key.toLowerCase() === fruit) { 
      return (Fruit as any)[key]; 
     } 
    } 

    return null; 
} 

const fruit: Fruit = getFruitFromApi(); 

switch (fruit) { 
    case Fruit.Orange: 
     console.log("orange"); 
     break; 
    case Fruit.Apple: 
     console.log("apple"); 
     break; 
    case Fruit.Banana: 
     console.log("banana"); 
     break; 
} 
関連する問題