- 타입스크립트에서는 기존 타입에 기반해 새 타입을 만들 수 있으므로 파생형을 일일이 유지보수하지 않고 최신으로 유지할 수 있다. 대표적으로
Pick<T>
과 Omit<T>
헬퍼 타입이 있다.
- 매핑된 타입
Pick<T>
은 객체의 키 하위 집합을 가져다 선택한 키만을 포함하는 새 객체를 만든다.
| type Pick<T, K extends keyof T> = { |
| [P in K]: T[P]; |
| } |
| |
| type PersonName = Pick<Person, 'name'>; |
| type PersonStrings = Pick<Person, 'name' | 'profession'>; |
Omit<T>
은 포함하고 싶지 않은 프로퍼티 집합으로 매핑한다. 이를 통해 특정 프로퍼티를 제거할 수 있다.
| type Omit<T, K extends string | number | symbol> = { |
| [P in Exclude<keyof T, K>]: T[P]; |
| } |
| |
| type PersonWithoutAge = Omit<Person, 'age'>; |
- 프로퍼티 키를 매핑할 때 조건부 타입과 타입 어서션을 이용하여 프로퍼티명이 아니라 타입에 기반해 프로퍼티를 선택하는 객체 헬퍼 타입을 만들 수 있다.
| type Select<O, T> = { |
| [K in keyof O as O[K] extends T | undefined ? K : never]: O[K]; |
| } |
| |
| type Remove<O, T> = { |
| [K in keyof O as O[K] extends T | undefined ? never : K]: O[K]; |
| } |
- 특정 타입을 가리키는 프로퍼티 키를 제거하기 위해서는
Omit<T>
처럼 조건을 객체의 오른쪽이 아니라 프로퍼티가 생성되는 왼편에 추가한다. keyof Person을 매핑할 때 타입 어서션으로 프로퍼티 키의 타입을 바꿀 수 있다.
| |
| type PersonStrings = { |
| [K in keyof Person as Person[K] extends string | undefined ? K : never]: Person[K]; |
| } |
Select<O, T>
는 객체에서 지정한 타입만 선택할 수 있다.
| type Select<O, T> = { |
| [K in keyof O as O[K] extends T | undefined ? K : never]: O[K]; |
| } |
| |
| type PersonStrings = Select<Person, string>; |
| type PersonNumber = Select<Person, number>; |
| |
| |
| type StringFnsReturningNumber = Select<String, (...arg: any[]) => number> |
Remove<O, T>
은 특정 타입의 프로퍼티 키를 제거한다.
| type Remove<O, T> = { |
| [K in keyof O as O[K] extends T | undefined ? never : K]: O[K]; |
| } |
| |
| type PersonWithoutStrings = Remove<Person, string>; |
| |
| |
| type User = { |
| name: string; |
| age: number; |
| profession?: string; |
| posts(): string[]; |
| greeting(): string; |
| } |
| |
| type SerializeableUser = Remove<User, Function>; |