유틸리티 타입(Utility Types)은 기존 타입에서 새 타입을 만들어 주는 TypeScript 내장 제네릭 타입이다. 같은 모양을 손으로 다시 선언하지 않게 해 준다.
| 타입 | 결과 |
|---|---|
Partial<T> | 모든 속성을 선택적으로 |
Required<T> | 모든 속성을 필수로 |
Readonly<T> | 모든 속성을 읽기 전용으로 |
Pick<T, K> | 지정한 키만 |
Omit<T, K> | 지정한 키를 빼고 |
Record<K, V> | 키 K, 값 V인 객체 |
Exclude<U, X> | 유니언에서 X를 뺌 |
ReturnType<F> · Parameters<F> | 함수의 반환·매개변수 타입 |
type CreateUserInput = Pick<User, 'name' | 'email'>
type UpdateUserInput = Partial<CreateUserInput> // PATCH용
type PublicUser = Omit<User, 'password'>- 속성 타입을 바꿀 때는
&만으로는 안 된다.{ config: unknown } & { config: Layout }은 교체가 아니라 교집합이다. 먼저Omit으로 지우고 다시 붙인다
type Group = Omit<ApiGroup, 'layout'> & { layout: LayoutConfig }Readonly의 반대(쓰기 가능하게)는 내장이 없어서 매핑된 타입의-readonly수정자로 만든다(매핑된 타입과 keyof)- 생성/수정/조회용 타입을 도메인 타입 하나에서 파생시키면 필드가 바뀔 때 한 곳만 고치면 된다(DRY 원칙). 단, 화면 편의 타입이 도메인 타입보다 많아지면 오히려 읽기 어렵다