유틸리티 타입이란?
- 유틸리티 타입이란 타입스크립트가 자체적으로 제공하는 특수한 타입들이다.
- 제네릭, 맵드 타입, 조건부 타입 등의 타입 조작 기능을 이용해 실무에서 자주 사용되는 유용한 타입들을 모아 놓은 것을 의미한다.
- 예를 들어 다음과 같이
Readonly<T>와 같은 유틸리티 타입을 이용해 특정 객체 타입의 모든 프로퍼티를 읽기 전용 프로퍼티로 변환할 수 있다.

- 또는 다음과 같이
Partial<T> 유틸리티 타입을 이용해 특정 객체 타입의 모든 프로퍼티를 선택적 프로퍼티로 변환하는 것도 가능합니다.

- 타입스크립트는 굉장히 다양한 유틸리티 타입을 제공한다. 모두 살펴볼 필요는 없고, 핵심만 추려서 알아보자.

맵드 타입 기반의 유틸리티 타입들 1
Partial<T>
- 가장 처음으로 살펴볼 유틸리티 타입은 Partial<
T> 타입이다. Partial은 부분적인 또는 일부분의 라는 뜻으로 특정 객체 타입의 모든 프로퍼티를 선택적 프로퍼티로 변환한다.
- 따라서 기존 객체 타입에 정의된 프로퍼티들 중 일부분만 사용할 수 있도록 도와주는 타입이다.

- 그런데 이때 문제가 발생한다. 위와 같이 게시글의 일부 정보가 아직 설정되어 있지 않은 임시 저장 게시글의 경우에도 변수에 저장할 수 있어야 하는데, 해당 변수를 Post 타입으로 정의하면 오류가 발생한다.
- 그렇다고 임시 저장 게시글 기능을 위해 Post 타입의 모든 프로퍼티를 선택적 프로퍼티로 설정하는 것도 곤란하다. 진짜 작성이 완료되어 화면에 렌더링 될 게시글들은 이 모든 프로퍼티를 진짜 다 가지고 있어야 하기 때문이다.
- 이럴때 Partial<
T> 유틸리티 타입을 이용한다.

Required<T>
- Required는 우리말로 필수의, 필수적인 이라는 뜻으로 특정 객체 타입의 모든 프로퍼티를 필수(선택적이지 않은) 프로퍼티로 변환한다.

- 이렇게 Required를 해주면 ?로 옵셔널을 걸어주었지만 모두 필수 프로퍼티가 되었다.
Readonly<T>
- Readonly는 우리말로 읽기 전용 이라는 뜻으로 특정 객체 타입의 모든 프로퍼티를 읽기 전용 프로퍼티로 변환한다.

- Readonly<
Post>는 Post 타입의 모든 프로퍼티를 readonly(읽기 전용) 프로퍼티로 변환한다. 따라서 점표기법을 이용해 특정 프로퍼티의 값을 수정하려고 하면 오류를 발생시킨다.
맵드 타입 기반의 유틸리티 타입들 2
Pick<T, K>
- Pick은 우리말로 뽑다, 고르다 라는 뜻이다. 따라서 특정 객체 타입으로부터 특정 프로퍼티 만을 골라내는 그런 타입이다.
- 예를 들어 Pick 타입에 T가 name, age가 있는 객체 타입이고 K가 name 이라면 결과는 name만 존재하는 객체 타입이 된다.

- 이렇게 Post 타입을 적용할 수 없다면 다음과 같이 해보자.

- 변수 legacyPost의 타입으로
Pick<Post, "title" | "content">을 정의했다. 따라서 이때 타입변수 T에는 Post가, 타입변수 K에는 “title” | “content” 이 각각 할당된다. 그럼 Post 타입으로부터 “title”과 “content” 프로퍼티만 쏙 뽑아낸 객체 타입이 된다.
Omit<T, K>
- Omit은 우리말로 생략하다, 빼다 라는 뜻이다. 따라서 특정 객체 타입으로부터 특정 프로퍼티 만을 제거하는 타입이다. 예를 들어 Omit 타입에 T가 name, age가 있는 객체 타입이고, K가 name 이라면 결과는 name을 제외하고 age 프로퍼티만 존재하는 객체 타입이 된다.

- 이렇게 noTitlePost에 title 프로퍼티가 없으면 오류가 발생하게 된다.

- 위와 같이
Omit을 이용해 Post 타입으로부터 title 프로퍼티를 제거한 타입으로 변수의 타입을 정의해 주면 된다.
Record<K, V>

- 이런 타입이 있을때 버전이 추가된다면 똑같이 생긴 프로퍼티를 계속 추가해줘야 한다. 중복 코드가 발생할 것이다.
- 이럴 때 바로 Record를 이용하면 된다. 다음과 같이 K에는 어떤 프로퍼티들이 있을지 String Literal Union 타입을 할당하고 V에는 프로퍼티의 값 타입을 할당한다.

- 위 Record 타입은 K에는
“large” | “medium” | “small”이 할당되었으므로 large, medium, small 프로퍼티가 있는 객체 타입을 정의한다. 그리고 각 프로퍼티 value의 타입은 V에 할당한 { url : stirng } 이 된다.
조건부 타입 기반의 유틸리티 타입들
Exclude<T, K>
- Exclude 타입은 다음과 같이 T로부터 U를 제거하는 타입이다.

- Extract 타입은 다음과 같이 T로 부터 U를 추출하는 타입이다.

ReturnType<T>
ReturnType은 타입변수 T에 할당된 함수 타입의 반환값 타입을 추출하는 타입이다.

이미지 출처: <한 입 크기로 잘라먹는 타입스크립트>
https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8?inst=68d752f7&utm_source=instructor&utm_medium=referral&utm_campaign=inflearn_%ED%8A%B8%EB%9E%98%ED%94%BD_promotion-link