"Mapped 타입이 타입-레벨 loop. Key 에 iterate, 새 모양 만들어."
Mapped-type 문법
{ [K in keyof T]: NewType } 가 T 의 key 에 iterate 해서 새 object 타입 만들어. 각 key K 에 대해, property 의 value 타입이 colon 후에 너가 쓴 어떤 표현이든 — 보통 K, T[K], 또는 둘 다 포함.
이게 `Partial`, `Required`, `Readonly`, 많은 utility 타입 만드는 법. 하나 보자:
type Partial<T> = { [K in keyof T]?: T[K] };
T 의 key 에 loop, 각각에 `?` 로 optional 표시, 원래 value 타입 유지. Identity mapped 타입에서 3 변화, 어느 것도 복잡 안 함.
Modifier: `+` 와 `-`
Mapped 타입이 modifier 명시적으로 추가/제거 가능. +? 가 optional 추가, -? 가 optional 제거. +readonly 가 readonly 추가, -readonly 가 제거. Required 가 -? 써서 optionality strip.
Plus 가 보통 생략 (default 방향). Minus 는 key 가 이미 가진 modifier 제거하고 싶을 때 쓰는 거.
`as` 통한 key remapping
TypeScript 4.1 이 mapped 타입에 as 추가: { [K in keyof T as NewKey]: ... }. `NewKey` 가 string-조작 타입 표현 (자주 template literal) 일 수, 통과하는 key 변환. 'get prefix 모든 key 에 추가' 같은 타입 빌드 가능.