2016-10-28 2 views
0

"orange", "apple" 또는 "banana" 일 수있는 API에서 오는 값이 있습니다. 그럼 내가 Fruit으로 API에서 값을 입력 할 수 있습니다문자열 기반 열거 형 시뮬레이션 방법

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

;

그래서 먼저 내가 같은 유형을 생성

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.Orange, Fruit.AppleFruit.Banana과 같은 것을 사용하고 싶습니다. 기본적으로 열거 형과 비슷하지만 숫자 대신 문자열과 일치하는 값을 사용합니다.

답변

3

이 오래된에서 답을 촬영
당신은 컴파일 오류를 제거하는 any으로 캐스팅 할 수 있습니다 질문 :

: 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으로 변경하면 "orange"으로 처리됩니다.

0

열거 형의 값을 지정할 수 있지만 숫자가 아닌 경우 컴파일러에서 값을 선호하지 않습니다.

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; 
}