답변:
TypeScript 0.9의 열거 형은 문자열 + 숫자 기반입니다. 간단한 변환을 위해 형식 어설 션이 필요하지 않아야합니다.
enum Color{
Red, Green
}
// To String
var green: string = Color[Color.Green];
// To Enum / number
var color : Color = Color[green];
내 OSS 책에 이것과 다른 Enum 패턴에 대한 문서가 있습니다 : https://basarat.gitbook.io/typescript/type-system/enums
var color : Color = Color[green as keyof typeof Color];
Typescript 2.1에서 열거 형의 문자열 키는 강력하게 입력됩니다. keyof typeof사용 가능한 문자열 키에 대한 정보를 얻는 데 사용됩니다 ( 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
let s = "Green"; let typedColor = <keyof typeof Color> s;
let와 함께 const캐스팅없이 의지 작동합니다. 이를 명확히하기 위해 예제를 업데이트했습니다. 감사합니다 @ SergeyT
typedColorString = Color["Black"];error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
const color: Color = Color[colorString as keyof typeof Color];
입력 문자열이 Color 열거 형과 정확히 일치한다고 확신하는 경우 다음을 사용하십시오.
const color: Color = (<any>Color)["Red"];
입력 문자열이 Enum과 일치하지 않을 경우 다음을 사용하십시오.
const mayBeColor: Color | undefined = (<any>Color)["WrongInput"];
if (mayBeColor !== undefined){
// TypeScript will understand that mayBeColor is of type Color here
}
우리는 캐스팅하지 않는 경우 enum에 <any>다음을 입력 타이프는 오류를 표시합니다 :
인덱스 표현식이 'number'유형이 아니기 때문에 요소에 내재적으로 'any'유형이 있습니다.
기본적으로 TypeScript Enum 유형은 숫자 인덱스와 함께 작동 let c = Color[0]하지만 문자열 인덱스와 는 작동
하지 않습니다 let c = Color["string"]. 이것은보다 일반적인 이슈 인 Object string index 에 대한 Microsoft 팀의 알려진 제한 사항 입니다.
typeof '0'이어야한다string
enum Color{
Red, Green
}
// To String
var green: string = Color[Color.Green];
// To Enum / number
var color : Color = Color[green as keyof typeof Color]; //Works with --noImplicitAny
이 예제는 --noImplicitAnyTypeScript에서 작동합니다.
출처 :
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
이 메모 는 원래 질문이 아니라 바카라의 답변 과 관련이 있습니다.
내 코드에서 컴파일러가 다음 코드를 사용하여 "문자열을 색상으로 변환 할 수 없음"과 거의 비슷한 오류를 발생시키는 이상한 문제가있었습니다.
var colorId = myOtherObject.colorId; // value "Green";
var color: Color = <Color>Color[colorId]; // TSC error here: Cannot convert string to Color.
컴파일러 유형 추론이 혼란스러워지고 colorIdID가 아닌 열거 형 값 이라고 생각했습니다 . 문제를 해결하려면 ID를 문자열로 캐스팅해야했습니다.
var colorId = <string>myOtherObject.colorId; // Force string value here
var color: Color = Color[colorId]; // Fixes lookup here.
문제의 원인을 잘 모르겠지만 다른 사람이 같은 문제를 겪을 경우를 대비하여이 메모를 남길 것입니다.
열거 형에 문자열 값을 제공하면 스트레이트 캐스트가 정상적으로 작동합니다.
enum Color {
Green = "Green",
Red = "Red"
}
const color = "Green";
const colorEnum = color as Color;
const colorEnum = "Blue" as Color오류가 없으며 colorEnum괜찮습니다. 그러나 당신이 console.log그것에 있었다면, 당신은 "파란색"을 보게 될 것입니다. Artru의 대답은 있기 때문에 좋은 colorEnum것입니다 undefined그리고 당신은 그 구체적으로 확인할 수 있습니다 -.
또한 동일한 컴파일러 오류가 발생했습니다. Sly_cardinal의 접근 방식이 약간 짧습니다.
var color: Color = Color[<string>colorId];
myProp.color = Color[<string><any>myProp.color] Cheers
TypeScript 컴파일러가 변수 유형이 문자열임을 알고 있으면 다음과 같이 작동합니다.
let colorName : string = "Green";
let color : Color = Color[colorName];
그렇지 않으면 컴파일러 경고를 피하기 위해 명시 적으로 문자열로 변환해야합니다.
let colorName : any = "Green";
let color : Color = Color["" + colorName];
런타임시 두 솔루션이 모두 작동합니다.
<string>colorName대신 typecast 를 사용하지 "" + colorName않습니까?
이 질문에는 많은 정보가 혼합되어 있으므로 Nick의 TypeScript 모델에서 열거 형 사용 안내서의 TypeScript 2.x +에 대한 전체 구현을 다루 겠습니다 .
이 안내서는 다음을위한 것입니다. 클라이언트 측에서 Enum으로 편리하게 모델링 될 서버에서 알려진 문자열 세트를 수집하는 클라이언트 측 코드를 작성하는 사람들.
열거 형부터 시작하겠습니다. 다음과 같이 보일 것입니다 :
export enum IssueType {
REPS = 'REPS',
FETCH = 'FETCH',
ACTION = 'ACTION',
UNKNOWN = 'UNKNOWN',
}
여기서 주목해야 할 두 가지는 :
우리는 이것을 문자열로 열거 된 열거 형으로 명시 적으로 선언하고있어 관련이없는 다른 숫자가 아닌 문자열로 인스턴스화 할 수 있습니다.
서버 모델에 존재하거나 존재하지 않는 옵션을 추가했습니다 : UNKNOWN. undefined원하는 대로 처리 할 수 있지만 처리 | undefined를 단순화하기 위해 가능한 한 유형 을 피하고 싶습니다 .
UNKNOWN사례 를 갖는 것에 대한 가장 좋은 점은 코드에서 실제로 알 수 있고 알 수없는 열거 형 경우의 스타일을 밝고 빨간색으로 깜박임으로써 무언가를 올바르게 처리하지 못한다는 것을 알 수 있습니다.
이 열거 형을 다른 모델에 포함 시키거나 단독으로 사용할 수도 있지만 JSON 또는 XML (ha)의 문자열 형식의 열거 형을 강력한 형식의 대응 형으로 구문 분석해야합니다. 다른 모델에 포함 된 경우이 구문 분석기는 클래스 생성자에 있습니다.
parseIssueType(typeString: string): IssueType {
const type = IssueType[typeString];
if (type === undefined) {
return IssueType.UNKNOWN;
}
return type;
}
열거 형이 올바르게 구문 분석되면 올바른 유형으로 끝납니다. 그렇지 않으면, undefined당신은 그것을 가로 챌 수 있고 당신의 UNKNOWN사건을 반환 할 수 있습니다 . undefined알 수없는 사례로 사용하는 것을 선호하는 경우 열거 형 구문 분석 시도 결과를 반환 할 수 있습니다.
거기에서 구문 분석 기능을 사용하고 새로 강력한 유형 변수를 사용하면됩니다.
const strongIssueType: IssueType = parseIssueType('ACTION');
// IssueType.ACTION
const wrongIssueType: IssueType = parseIssueType('UNEXPECTED');
// IssueType.UNKNOWN
IssueType.UNKNOWN열쇠 reps에 키가 없기 때문에 항상 돌아옵니다 . 문자열에 하이픈이 포함되어있어 키로 사용할 수 없기 때문에 여전히 나쁜 해결책을 찾지 못했습니다.
열거 형 값을 반복하는 방법을 알아야했습니다 (여러 열거 형의 많은 순열을 테스트하고있었습니다).
export enum Environment {
Prod = "http://asdf.com",
Stage = "http://asdf1234.com",
Test = "http://asdfasdf.example.com"
}
Object.keys(Environment).forEach((environmentKeyValue) => {
const env = Environment[environmentKeyValue as keyof typeof Environment]
// env is now equivalent to Environment.Prod, Environment.Stage, or Environment.Test
}
출처 : https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/
each하여 모든 단일 열거 형 사례를 한 가지 방법으로 만 테스트합니다
enum에서에서 얻을 수있는 답변을 찾고 string있었지만 내 경우에는 열거 형 값에 다른 문자열 값이 있습니다. OP에는 간단한 열거 형이 Color있었지만 다른 점이있었습니다.
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
당신이 해결하려고하면 Gender.CantTell로모그래퍼 "Can't tell"문자열이 반환 undefined원래의 대답.
기본적으로, 나는 강하게 영감을 다른 답변, 해낸 이 답변 :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
filter. 그렇지 않은 경우 undefined반환됩니다.enumObj로 any인해 타이프 3.0 이상 (현재 타이프 3.5 사용)는이와 함께, enumObj같이 해결됩니다 unknown.const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
참고 : 누군가 주석에서 지적했듯이 noImplicitAny.
캐스트 any및 올바른 입력이 없습니다.
export const stringToEnumValue = <T, K extends keyof T>(enumObj: T, value: string): T[keyof T] | undefined =>
enumObj[Object.keys(enumObj).filter((k) => enumObj[k as K].toString() === value)[0] as keyof typeof enumObj];
또한 업데이트 된 버전은 더 쉽게 호출 할 수 있으며 더 읽기 쉽습니다.
stringToEnumValue(Gender, "Can't tell");
열거 형
enum MyEnum {
First,
Second,
Three
}
샘플 사용법
const parsed = Parser.parseEnum('FiRsT', MyEnum);
// parsed = MyEnum.First
const parsedInvalid= Parser.parseEnum('other', MyEnum);
// parsedInvalid = undefined
대소 문자 구분 구문 분석 무시
class Parser {
public static parseEnum<T>(value: string, enumType: T): T[keyof T] | undefined {
if (!value) {
return undefined;
}
for (const property in enumType) {
const enumMember = enumType[property];
if (typeof enumMember === 'string') {
if (enumMember.toUpperCase() === value.toUpperCase()) {
const key = enumMember as string as keyof typeof enumType;
return enumType[key];
}
}
}
return undefined;
}
}
return enumType[property];형 항목이 다음과 같은 경우에 넣어야 합니다Skills = "anyvalue"
수행 한 방식으로 생성 된 열거 형은 정방향 (name -> value)및 역방향 (value -> name)매핑을 모두 저장하는 객체로 컴파일됩니다 . 이 크롬 devtools 스크린 샷에서 볼 수 있듯이 :
다음은 이중 매핑의 작동 방식과 서로 캐스트하는 방법에 대한 예입니다.
enum Color{
Red, Green
}
// To Number
var greenNr: number = Color['Green'];
console.log(greenNr); // logs 1
// To String
var greenString: string = Color[Color['Green']]; // or Color[Color[1]
console.log(greenString); // logs Green
// In your example
// recieve as Color.green instead of the string green
var green: string = Color[Color.Green];
// obtain the enum number value which corresponds to the Color.green property
var color: Color = (<any>Color)[green];
console.log(color); // logs 1
네임 스페이스를 사용하여 열거 형의 기능을 확장하는 경우 다음과 같은 작업을 수행 할 수도 있습니다
enum Color {
Red, Green
}
export namespace Color {
export function getInstance(color: string) : Color {
if(color == 'Red') {
return Color.Red;
} else if (color == 'Green') {
return Color.Green;
}
}
}
이렇게 사용하세요
Color.getInstance('Red');
다른 변형이 될 수 있습니다
const green= "Green";
const color : Color = Color[green] as Color;
--noImplicitAny(VS 체크되지 않은 "암시 적 '모든'유형 허용"). 그것은error TS7017: Index signature of object type implicitly has an 'any' type.나를 위해 이것을 작동 :var color: Color = (<any>Color)[green];(버전 1.4로 테스트)