JSON 문자열에서 문자 'enum'을 입력합니다.
JSON의 문자열과 호환되는 TypeScript 열거형이 있습니까?
예를 들어 다음과 같습니다.
enum Type { NEW, OLD }
interface Thing { type: Type }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // false
하고 싶다 thing.type == Type.NEW
진실되게.또는 더 구체적으로 말하면,enum
값이 숫자가 아닌 문자열로 정의됩니다.
사용할 수 있다는 것을 알고 있습니다.thing.type.toString() == Type[Type.NEW]
그러나 이는 번거롭고 열거형 주석을 혼동하고 오해의 소지가 있어 목적에 어긋난다.JSON이 기술적으로 유효한 열거 값을 제공하지 않으므로 열거에 속성을 입력하지 않아야 합니다.
그래서 현재는 static constant를 가진 문자열 유형을 사용하고 있습니다.
const Type = { NEW: "NEW", OLD: "OLD" }
interface Thing { type: string }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // true
이렇게 하면 원하는 사용법을 얻을 수 있지만, 유형 주석string
너무 광범위하고 오류가 발생하기 쉽습니다.
JavaScript의 슈퍼셋에는 문자열 기반의 enum이 없다는 것에 조금 놀랐습니다.내가 뭘 빼놓았나요?다른 방법이 있나요?
TS 1.8 업데이트
스트링 리터럴 타입을 사용하는 것도 다른 방법이지만(@basaret 감사), 원하는 열거형 사용법(위)을 얻으려면 값을 두 번 정의해야 합니다.한 번은 스트링 리터럴 타입으로, 한 번은 값(정수 또는 네임스페이스)으로 정의해야 합니다.
type Type = "NEW" | "OLD";
const Type = {
NEW: "NEW" as Type,
OLD: "OLD" as Type
}
interface Thing { type: Type }
let thing:Thing = JSON.parse(`{"type": "NEW"}`);
alert(thing.type === Type.NEW); // true
이것은 작동하지만 보일러 플레이트가 많이 필요하기 때문에 대부분의 경우 사용하지 않습니다.현재로선 에 대한 제안이 결국 로드맵이 되기를 바랍니다.
TS 2.1 업데이트
새로운 타입 룩업에서는 const 또는 네임스페이스의 키에서 문자열 리터럴타입을 생성할 수 있습니다.이 때문에, 정의가 용장하지 않게 됩니다.
namespace Type {
export const OLD = "OLD";
export const NEW = "NEW";
}
type Type = keyof typeof Type;
interface Thing { type: Type }
const thing: Thing = JSON.parse('{"type": "NEW"}');
thing.type == Type.NEW // true
TS 2.4 업데이트
TypeScript 2.4에 문자열 Enum 지원이 추가되었습니다!위의 예는 다음과 같습니다.
enum Type {
OLD = "OLD",
NEW = "NEW"
}
interface Thing { type: Type }
const thing: Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW) // true
거의 완벽해 보이지만, 아직도 가슴 아픈 부분이 있습니다.
- 그래도 값을 두 번 써야 합니다.
OLD = "OLD"
오타가 없다는 것을 증명할 수 없습니다.NEW = "MEW"
이건 이미 진짜 암호에 물었어 enum의 타입 체크 방법에는 몇 가지 이상한 점(아마도 버그?)이 있습니다.이것은 스트링 리터럴 타입의 속기만이 아닙니다.이것은 정말 올바른 것입니다.몇 가지 문제에 부딪혔습니다.
enum Color { RED = "RED", BLUE = "BLUE", GREEN = "GREEN" } type ColorMap = { [P in Color]: number; } declare const color: Color; declare const map: ColorMap; map[color] // Error: Element implicitly has an 'any' type because type 'ColorMap' has no index signature. const red: Color = "RED"; // Type '"RED"' is not assignable to type 'Color'. const blue: Color = "BLUE" as "RED" | "BLUE" | "GREEN"; // Error: Type '"RED" | "BLUE" | "GREEN"' is not assignable to type 'Color'.
와 동등한 코드
enum Color
문자열 리터럴 타입으로 대체되어 정상적으로 동작합니다...
네, 강박장애가 있는 것 같아요. 그냥 완벽한 JS 에넘이 필요해요.:)
을 2.4 Typescript로 설정하여 .any
.
enum Type {
NEW = <any>"NEW",
OLD = <any>"OLD",
}
interface Thing { type: Type }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // true
Typescript 2.4는 문자열 Enum을 이미 지원하므로 캐스트는 다음과 같습니다.any
는 불필요하게 되어, 를 사용하지 않아도 됩니다.검증 및 자동완성은 가능하지만 사용 시나리오에 따라서는 가독성 및 리팩터링에는 그다지 적합하지 않습니다.
2021년에도 이 질문을 계속 보고 있는 사람이 있다면:
@Aaron은 원래의 질문에 이렇게 썼다.
거의 완벽해 보이지만, 아직도 가슴 아픈 부분이 있습니다.
아직 [...]하지 않으면 안 된다.
enum Color { RED = "RED", BLUE = "BLUE", GREEN = "GREEN" } type ColorMap = { [P in Color]: number; } declare const color: Color; declare const map: ColorMap; map[color] // Error: Element implicitly has an 'any' type because type 'ColorMap' has no index signature. // [...]
enum Color가 문자열 리터럴 형식으로 대체된 동등한 코드는 정상적으로 작동합니다.
네, 강박장애가 있는 것 같아요. 그냥 완벽한 JS 에넘이 필요해요.:)
1. keyof typeof enumObj
에 관하여,
enum Color가 문자열 리터럴 형식으로 대체된 동등한 코드는 정상적으로 작동합니다.
typeof
★★★★★★★★★★★★★★★★★」keyof
연산자가 연쇄적으로 연결되어 있습니다.
type ColorKeys = keyof typeof Color
type ColorMap = { [P in ColorKeys]: number; } // will have strongly typed keys
암묵적이지 않다any
시map: ColorMap
.
이것은 숫자 열거형에서도 동작합니다(이러한 열거형에서는, 이하와 같이 할 수 있습니다).const
를 참조해 주세요.
Enums는 런타임에 존재하는 실제 개체이지만 keyof 키워드는 일반적인 개체와 다르게 작동합니다.대신 keyof type of를 사용하여 모든 Enum 키를 문자열로 나타내는 Type을 가져옵니다.
2. ts-enum-util
체크 아웃: Enum과 관련된 모든 요구에 (아마도) 강한 타입의 인터페이스를 제공합니다.
TS 2.9.2
: ★★★★★★★★★★★★★★★*
export enum Enums { VALUE1, VALUE2 }
API json에서 값을 얻었을 때:
switch (response.enumValue.toString()) { //can be without toString if we have string value from JSON.
case Enums[Enums.VALUE1]:
...
case Enums[Enums.VALUE2]:
...
}
그러나 주석 문자열 유형은 너무 광범위하고 오류가 발생하기 쉽습니다.
동의했습니다. 간단한 해결 방법(코드 생성의 여유로움이 있으면 이를 자동화할 수 있습니다):
interface Thing { type: "NEW" | "OLD" }
이것들은 유니언에서는 현악 리터럴이라고 불립니다.기타 : https://basarat.gitbooks.io/typescript/content/docs/tips/stringEnums.html
임시방편으로 변환기 기능을 사용하고 있습니다.이 스레드가 해결되기를 바랍니다.https://github.com/Microsoft/TypeScript/issues/1206
enum ErrorCode {
Foo,
Bar
}
interface Error {
code: ErrorCode;
message?: string;
}
function convertToError(obj: any): Error {
let typed: Error = obj as Error;
// Fix any enums
typed.code = ErrorCode[typed.code.toString()];
return typed;
}
언급URL : https://stackoverflow.com/questions/35760096/typescript-enum-from-json-string
'programing' 카테고리의 다른 글
C# 클래스에서 JSON 스키마를 생성하는 중 (0) | 2023.02.26 |
---|---|
Ajax 요청이 성공한 페이지 리디렉션 (0) | 2023.02.26 |
워드프레스 사이트 제목과 태그라인을 표시하는 방법 (0) | 2023.02.26 |
문자열에서 JSON 개체로 변환 Android (0) | 2023.02.26 |
Web API 매개 변수는 항상 null입니다. (0) | 2023.02.26 |