2013-06-29 3 views

답변

176

TypeScript 0.9의 열거 형은 문자열 + 숫자 기반입니다. 당신은 간단한 변환을위한 유형의 주장을 필요가 없습니다 :

enum Color{ 
    Red, Green 
} 

// To String 
var green: string = Color[Color.Green]; 

// To Enum/number 
var color : Color = Color[green]; 

Try it online

내가 내 OSS 책이 다른 열거 패턴에 대한 documention 있습니다 https://basarat.gitbooks.io/typescript/content/docs/enums.html

+3

두 단어 : : 그냥 끝내 :) –

+33

이 --noImplicitAny''작동하지 않습니다 (VS의 검사되지 않은 "허용 keyof typeof 사용 가능한 문자열 키에 대한 정보 (1를) 가져 오는 데 사용됩니다 암시적인 '모든 유형'). 그것은 오류 TS7017 : 객체 유형의 색인 서명이 암시 적으로 'any'유형을가집니다. 내 작품 :'var color : Color = ( Color) [녹색];'(버전 1.4로 테스트 됨) – Vojta

+2

@Voja 권리. 그 VS 2012에서 작동하지 않습니다.이 하나의 일하지만 var 색상 : 색상 = ( 색상) [녹색]; –

12

다음 코드를 사용하여 작동합니다.

var green= "Green"; 
var color : Color= <Color>Color[green]; 
21

이 노트는 basarat의 answer에 관한 것으로,하지 원래 질문. 컴파일러는이 코드의 상당을 사용하여 "컬러로 문자열을 변환 할 수 없습니다"거의 비슷 오류를주고 있었다 곳

나는 내 자신의 프로젝트에 이상한 문제가 있었다 :

var colorId = myOtherObject.colorId; // value "Green"; 
var color: Color = <Color>Color[colorId]; // TSC error here: Cannot convert string to Color. 

내가 발견 컴파일러 유형 추론이 혼란스러워지고 colorId은 ID가 아닌 enum 값이라고 생각했습니다. 내가 문자열로 ID를 캐스팅했다 문제를 해결하려면 :

var colorId = <string>myOtherObject.colorId; // Force string value here 
var color: Color = Color[colorId]; // Fixes lookup here. 

내가 문제의 원인을 모르겠어요를하지만 난 여기에이 메모를 남겨 것이다 경우에 누군가가 내가 한 동일한 문제로 실행됩니다.

+0

고마워! 이것은 나를 미치게했다. – olore

8

동일한 컴파일러 오류가 발생했습니다. Sly_cardinal의 접근 방식이 약간 짧은 편입니다.

var color: Color = Color[<string>colorId]; 
+0

추가로 : 당신이 할 수있는 문자열 (예를 들어, AngularJS를 통해 Asp 웹 API를 말할 수있는 것처럼) 열거 형을 직렬화하는 자바 스크립트 레이어에 의해 입력 된 typescript 열거 형이있는 경우에 당신이 할 수 'myProp.color = Color [ myProp.color] 건배 – Victor

+0

이것은 인정 된 대답이어야합니다. –

3

타이프 라이터 컴파일러이 달리

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

작동 명시 적으로 문자열로 변환해야보다 변수의 유형이 문자열 인 것을 알고있는 경우

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

에서 (컴파일러 경고를 피하기 위해) 런타임 두 솔루션 모두 작동합니다.당신이 입력 문자열 색상 열거와 정확히 일치하는이 있는지 확인하는 경우

+2

왜 그냥 "colorName"대신에 타입 캐스트 ' colorName'을 사용하지 않을까요? – SergeyT

9

후 사용

const mayBeColor: Color | undefined = (<any>Color)["WrongInput"]; 
if(mayBeColor !== undefined){ 
    //TSC will understand that mayBeColor of type Color here 
} 

Playground

: 입력 문자열이 열거 사용과 일치하지 않을 수 있습니다 경우

const color: Color = (<any>Color)["Red"]; 


캐스팅하지 않으면 enum<any> type then tsc는 오류를 표시합니다.

인덱스 표현식이 'number'유형이 아니기 때문에 요소에 암시 적으로 'any'유형이 있습니다.

은 기본적 TS 열거 형에 의해 즉 let c = Color[0] 있지만 let c = Color["string"] 같은 문자열 인덱스, 숫자 인덱스와 함께 작동 것을 의미한다. 이는보다 일반적인 문제 Object string indexes에 대한 Microsoft 팀의 알려진 제한 사항입니다.

22

현재 Typescript 2.1에서 열거 형의 문자열 키는 강력하게 형식화되어 있습니다.

enum Color{ 
    Red, Green 
} 

let typedColor: Color = Color.Green; 
let typedColorString: keyof typeof Color = "Green"; 

// Error "Black is not assignable ..." (indexing using Color["Black"] will return undefined runtime) 
typedColorString = "Black"; 

// Error "Type 'string' is not assignable ..." (indexing works runtime) 
let letColorString = "Red"; 
typedColorString = letColorString; 

// Works fine 
typedColorString = "Red"; 

// Works fine 
const constColorString = "Red"; 
typedColorString = constColorString 

// Works fine (thanks @SergeyT) 
let letColorString = "Red"; 
typedColorString = letColorString as keyof typeof Color; 

typedColor = Color[typedColorString]; 

https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types

+1

그래서 우리는 타입 변환을 사용할 수 있습니다 :'let s = "Green"; let typeed Color = s;' – SergeyT

+0

네,'let'을'const'로 바꾸면 캐스팅하지 않고도 작동합니다. 이를 명확히하기 위해 예제를 업데이트했습니다. 고마워요 @ SergeyT – Victor

관련 문제