[Typescript] 유틸리티 타입

성준영·2022년 7월 27일
0

유틸리티 타입이란?

유틸리티 타입은 이미 작성된 타입을 변경하고 싶을 때 사용하는 타입이다.

이번에는 많은 유틸리티 타입 중에서 Partial Pick Omit에 대해 알아보려 한다.

더 많은 유틸리티 타입을 알아 보고 싶다면 아래 링크를 참고하면 된다.

링크

Partial | Pick | Omit

interface Profile {
  name: string;
  age: number;
  married: boolean;
} // 예시를 위한 Profile 타입

1. Partial

partial 타입 분석

Partial의 타입을 Ctrl + 클릭을 통해 타입 지정된 곳으로 가보면 아래와 같이 타입 지정이 되어있는 것을 알 수 있다.

type Partial<T> = {
    [P in keyof T]?: T[P];
};

[P in keyof T]? // 맵드 타입으로 T타입 안에 있는 key값들을 뽑아 내어
			    // 자신의 key값으로 설정하고 ?키워드로
                // key값을 optional로 설정
  
T[P] // T는 P를 key값으로 같는 타입이고 P는 T의 key이기 때문에
     // T타입 안에서 P값에 대응하는 value의 타입을 나타낸다. 

위의 설명을 종합해 봤을 때 Partial타입은 T타입의 key값들을 옵셔널로 만들어주는 것을 알 수 있다.

partial 사용 예시

const me: Profile = {
  name: "CodeYoung",
  age: 100,
  married: false,
};

const partialMe: Partial<Profile> = {
  name: "CodeYoung",
  married: false,
};

2. Pick

Pick 타입 분석

type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

K extends keyof T // K의 값은 T의 key값으로 제한

이를 통해 Pick타입은 제네릭 두번째 인자로 T타입 안에 있는 key값을 선택해 사용할 수 있는 것을 알 수 있다.

Pick 사용 예시

const pickMe: Pick<Profile, "name" | "age"> = {
  name: "CodeYoung",
  age: 100,
};

3. Omit

Omit 타입 분석

Omit타입은 또 다른 유틸리티 타입인 Exclude를 사용한다.

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Exclude<T, U> = T extends U ? never : T;

Omit타입 안의 Pick타입과 Exclude타입을 보면 알 수 있듯이 Omit타입은 두번 째 인자로 첫 번째인자로 받은 Tkey값을 받고 T타입에서 그 key값을 제외하는 타입이란 것을 알 수 있다.

Omit 사용 예시

const omitMe: Omit<Profile, "married"> = {
  name: "CodeYoung",
  age: 100,
};

전체 코드

interface Profile {
  name: string;
  age: number;
  married: boolean;
}

const me: Profile = {
  name: "CodeYoung",
  age: 100,
  married: false,
};

const partialMe: Partial<Profile> = {
  name: "CodeYoung",
  married: false,
};

const pickMe: Pick<Profile, "name" | "age"> = {
  name: "CodeYoung",
  age: 100,
};

const omitMe: Omit<Profile, "married"> = {
  name: "CodeYoung",
  age: 100,
};

내 생각

Partial 같은 경우에는 모든 요소를 옵셔널로 만들다 보니 사용하기는 편할 것 같지만 강력한 타입에 보호받기 어렵기 때문에 타입들 중 몇개만 뽑아쓴다면 Pick을 몇개만 제외하고 싶다면 Omit타입을 사용할 것 같다.

profile
기록해버리기

0개의 댓글