[TS] Pick, Omit, Select, Remove

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

'TypeScript' 카테고리의 다른 글

[TS] 타입 가드  (1) 2025.01.24
[TS] 타입 확장하기  (0) 2025.01.23
[TS] 제네릭 사용법  (0) 2025.01.22
[TS] 타입 조합  (0) 2025.01.21
[TS] 문자열 템플릿 리터럴 타입  (0) 2025.01.17