6.3.1. The keyof Type Operator

keyof 연산자는 오브젝트 타입을 받아 그 오브젝트의 키(프로퍼티 명)가 가지고 있는 타입, 즉 문자열 혹은 숫자 리터럴 유니온 타입을 생성한다.

-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 타입은 나중에 살펴볼 맵드 타입과 조합되었을 때 특히 유용하다.