keyof
Type Operatorkeyof 연산자는 오브젝트 타입을 받아 그 오브젝트의 키(프로퍼티 명)가 가지고 있는 타입, 즉 문자열 혹은 숫자 리터럴 유니온 타입을 생성한다.
-keyof-type-operator.ts-
type Point = { x: number; y: number };
type P = keyof Point;
// type P = keyof Point
특정 타입이 string
혹은 number
인덱스 시그니처를 가지고 있다면, keyof
는 그 타입을 대신 반환할 것이다.
-keyof-type-operator-index-signature.ts-
type Arrayish = { [n: number]: unknown };
type A = keyof Arrayish;
// type A = number
type Mapish = { [k: string]: boolean };
type M = keyof Mapish;
// type M = string | number
이 예제에서 M
의 타입이 string | number
인 것에 주목하자.
이는 자바스크립트 오브젝트의 키가 항상 문자열을 강제하기 때문이다.
따라서 obj[0]
은 항상 obj['0']
과 같다.
(역자주)다시 말해, M
은 키 데이터 이므로 그 타입이 number
여도 인덱스 시그니처에 나온대로 string
이 될 수 있기 때문에 이 M
의 타입은 number
가 될 수 있는 것이다.
한편, A
는 인덱스 시그니처에서 반드시 number
여야만 한다고 지정하였기 때문에 A
의 타입은 number
로 제한되는 것이다.
keyof
타입은 나중에 살펴볼 맵드 타입과 조합되었을 때 특히 유용하다.