- 타입스크립트에서는 기존 타입에 기반해 새 타입을 만들 수 있으므로 파생형을 일일이 유지보수하지 않고 최신으로 유지할 수 있다. 대표적으로
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>;