programing

형식 스크립트에서 Enum을 제한된 키 유형으로 사용

bestprogram 2023. 3. 28. 22:43

형식 스크립트에서 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 Enumkeyof typeof Enum

in Enum컴파일하여 값을 열거하고keyof typeof키를 열거합니다.

와 함께keyof typeofenum 속성은 변경할 수 없습니다.

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 문서를 참조하십시오.사용만keyofenums는 기능하지 않기 때문에 (키도 얻을 수 있습니다)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};

첫 번째 작성 후 오브젝트를 수정하기 위해 코드 끝에 행을 추가할 때까지 정상적으로 동작했습니다. 지금 이 은 ''이 '유형'을 하고 있었어요.keyofreadonly실제로:| 상공을 맴돌고 있습니다.myTypeTypescript 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>>;

:)

있는 분들을 위해keysenum 그것은 '그것'이다.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