형식 스크립트에서 Enum을 제한된 키 유형으로 사용
할 수 있다enum
로 사용되다key
type
뿐만 아니라number
또는string
현재 가능한 선언은 다음과 같습니다.x:{[key:number]:any}
여기서 키는 유형일 수 있습니다.number
또는string
다음 예시와 같은 것을 만들 수 있습니까?
예:
enum MyEnum
{
First,
Second
}
var layer:{[key:MyEnum]:any};
2018년 이후, Typescript에 더 쉬운 방법이 있습니다.keyof typeof
:
let obj: { [key in MyEnum]: any} =
{ [MyEnum.First]: 1, [MyEnum.Second]: 2 };
모든 키를 포함할 필요가 없는 경우:
let obj: { [key in MyEnum]?: any} =
{ [MyEnum.First]: 1 };
의 차이를 알기 위해in
그리고.keyof typeof
, 계속 읽습니다.
in Enum
대keyof typeof Enum
in Enum
컴파일하여 값을 열거하고keyof typeof
키를 열거합니다.
와 함께keyof typeof
enum 속성은 변경할 수 없습니다.
let obj: { [key in keyof typeof MyEnum]?: any} = { First: 1 };
obj.First = 1;
// Cannot assign to 'First' because it is a read-only property.
...사용하지 않는 한-readonly
:
let obj: { -readonly [key in keyof typeof MyEnum]?: any} = { First: 1 };
obj.First = 1; // works
하지만 다른 정수 키도 사용할 수 있습니다!?
let obj: { [key in keyof typeof MyEnum]?: any} = { First: 1 };
obj[2] = 1;
keyof typeof
컴파일 대상:
{
[x: number]: any;
readonly First?: any;
readonly Second?: any;
}
둘 다에 주의해 주세요.[x: number]
및 그readonly
특성.이것.[x: number]
문자열 열거와 함께 속성이 없습니다.
단,in Enum
오브젝트는 다음과 같이 변경할 수 있습니다.
enum MyEnum {
First, // default value of this is 0
Second, // default value of this is 1
}
let obj: { [key in MyEnum]?: any} = { [MyEnum.First]: 1 };
obj[MyEnum.First] = 1; // can use the enum...
obj[0] = 1; // but can also use the enum value,
// as it is a numeric enum by default
숫자 열거형이기 때문에 열거형 값을 사용했습니다.하지만 아무 숫자나 사용할 수는 없습니다.
obj[42] = 1;
// Element implicitly has an 'any' type because
// expression of type '42' can't be used to index type '{ 0?: any; 1?: any; }'.
// Property '42' does not exist on type '{ 0?: any; 1?: any; }'.
선언은 다음과 같이 컴파일됩니다.
{
0?: any;
1?: any;
}
오직.0
그리고.1
, enum 값은 사용할 수 있습니다.
이는 열거형이 작동하는 방식과 일치합니다. 다음과 같은 놀라운 점은 없습니다.keyof typeof
.
enum MyEnum
{
First = 1,
Second = "YES"
}
let obj: { [key in MyEnum]?: any} = { [MyEnum.First]: 1, [MyEnum.Second]: 2 };
obj[1] = 0;
obj["YES"] = 0;
유형은 다음과 같습니다.
{
1?: any;
YES?: any;
}
불변성을 실현하다readonly
:
let obj: { readonly [key in MyEnum]?: any} = {
[MyEnum.First]: 1,
};
obj[MyEnum.First] = 2;
// Cannot assign to '1' because it is a read-only property.
...이 열쇠들은readonly
:
{
readonly 1?: any;
readonly 2?: any;
}
자동 증가 함정
enum MyEnum
{
First = 1,
Second,
Third = 2,
}
let obj: { [key in MyEnum]?: any} = {
[MyEnum.First]: 10,
[MyEnum.Second]: 20,
[MyEnum.Third]: 30,
};
// {1: 10, 2: 30}
그20
값이 사라졌습니다!숫자 열거형은 자동으로 증가하지만 중복은 허용됩니다.즉, 이 두 가지 가치 모두MyEnum.Second
그리고.MyEnum.Third
이다2
!
TS는 경고하지 않습니다. 가능하면 보풀을 사용하세요.
요약
in Enum |
keyof typeof Enum |
---|---|
값을 열거하기 위해 컴파일합니다. | 열거 키로 컴파일합니다. |
열거형 외부에 값을 허용하지 않습니다. | 숫자 열거를 사용하는 경우 열거형 외부에 숫자 값을 허용할 수 있습니다. |
오브젝트를 변경할 수 있습니다.불변성 옵션인readonly |
Enum 속성은 다음과 같이 수정할 수 없습니다.-readonly . 열거형 외부에 있는 다른 숫자 값은 다음과 같습니다. |
자동 증분으로 인해 Enum 값이 충돌할 수 있습니다. | 자동 증분으로 인해 Enum 값이 충돌할 수 있습니다. |
사용하다in Enum
가능하면.코드베이스가 다음을 사용하는 경우keyof typeof Enum
이러한 함정에 주의해 주십시오.
네. 그냥 타이핑하세요.
let layer:{[key in keyof typeof MyEnum]: any}
그keyof
키워드는 Typescript 2.1부터 사용할 수 있습니다.자세한 내용은 TypeScript 문서를 참조하십시오.사용만keyof
enums는 기능하지 않기 때문에 (키도 얻을 수 있습니다)enum
열거형 상수가 아닌 입력)을 입력합니다.keyof typeof
.
단답:
let layer: Partial<Record<MyEnum, unknown>>;
장황한 답변(상세 포함):
저도 같은 문제가 있었어요.나는 다음과 같은 코드 작업을 하고 싶었다.
enum MyEnum {
xxx = "xxx",
yyy = "yyy",
zzz = "zzz",
}
type myType = ...; // Fill here
const o: myType = { // keys should be in MyEnum, values: number
[MyEnum.xxx]: 2,
"hi": 5, // <--- Error: complain on this one, as "hi" is not in enum
}
o[MyEnum.yyy] = 8; // Allow it to be modified later
이 질문에 대한 다른 답변에서 저는 다음과 같이 생각했습니다.
type myType = {[key in keyof typeof MyEnum]: number};
그것은 가 될 이다.o is missing "yyy"
그래서 오브젝트에 모든 키가 아니라 일부 열거 키가 포함된다는 것을 알려줘야 했습니다.그래서 덧붙이자면?
수수: :
type myType = {[key in keyof typeof MyEnum]?: number};
첫 번째 작성 후 오브젝트를 수정하기 위해 코드 끝에 행을 추가할 때까지 정상적으로 동작했습니다. 지금 이 은 ''이 '유형'을 하고 있었어요.keyof
이 readonly
실제로:| 상공을 맴돌고 있습니다.myType
Typescript Playground에는 다음과 같이 표시됩니다.
type myType = {
readonly xxx?: number | undefined;
readonly yyy?: number | undefined;
readonly zzz?: number | undefined;
}
한 「」를 삭제하려면 , 「」를 참조해 주세요.readonly
을 사용하다
type myType = {-readonly [key in keyof typeof myEnum1]?: number };
꽤 못생겼지만, 효과가 있어!
Typescript Utility Types를 가지고 놀다가 원하는 것을 찾을 때까지!
type myType = Partial<Record<keyof typeof MyEnum, number>>;
:)
있는 분들을 위해keys
enum
그것은 '그것'이다.value
type myType = Partial<Record<MyEnum, number>>;
다음과 같이 입력합니다.
type myType = Partial<Record<keyof typeof MyEnum, number>>;
사실 아무런 회피책 없이 잘 작동했어요.
예를 들어 다음과 같습니다.
enum EnumString {
a="a",
b="b"
}
enum EnumNum {
a,
b
}
type Type = "a" | "b"
let x1:{[k in EnumString]?:any }={a:1} //working
let x2:{[k in EnumNum]?:any }={a:1} //error: Type '{ a: number; }' is not assignable to type '{ 0?: any; 1?: any; }'
let x3:{[k in Type]?:any }={a:1} //working; defining a union type is easer than defining an enum string
let y1:{[k: EnumString]?:any }={a:1}
let y2:{[k: EnumNum]?:any }={a:1}
let y3:{[k in Type]?:any }={a:1}
let z1:{[k in keyof typeof EnumString]?:any }={a:1}
let z2:{[k in keyof typeof EnumNum]?:any }={a:1}
let z3:{[k: keyof typeof Type]?:any }={a:1}
'z1'은 'z1'이라는 는 'z1'이라는 키워드를 할 수 있습니다.-readonly
을 사용하다
x1.a=2
x3.a=2
z1.a=2 //error: read only
다양한 사례의 이슈를 직접 보기 위해 활자놀이터를 만들었습니다.
언급URL : https://stackoverflow.com/questions/44243060/use-enum-as-restricted-key-type-in-typescript
'programing' 카테고리의 다른 글
java.displaces를 클릭합니다.InlawalStateException:클래스를 조사하지 못했습니다. (0) | 2023.03.28 |
---|---|
TypeScript에서 단일 속성을 옵션으로 설정 (0) | 2023.03.28 |
반응 선택 비활성화 옵션 (0) | 2023.03.28 |
컴포넌트를 반응시키기 위한 전달 (0) | 2023.03.28 |
로드 시 WordPress 플러그인 변환 파일 재정의 (0) | 2023.03.28 |