SW/Typescript

[Typescript] 유틸리티 타입 - 1

BetaMan 2022. 10. 11. 23:43
728x90
반응형

Typescript 유틸리티 타입

1. 서론

Typescript는 타입선언 시 활용할 수 있는 여러가지 유틸리티 타입이라는 것을 제공한다. 유틸리티 타입은 어떤 임의의 타입을 제네릭으로 받아 여러가지 형태로 쉽게 변형할 수 있도록 만들어졌고 전역에서 사용 가능하다. 덕분에 간결한 코드로 타입 안정성이 보장된 인터페이스 설계가 가능하다.
Typescript는 현재(2022.10.11 기준)까지 22가지 유틸리티 타입을 제공한다. 종류가 많기 때문에 여러 포스트으로 나누어 작성하려고 한다.
본 포스트는 Typescript 공식 레퍼런스를 참고하여 작성됐다.

 

Documentation - Utility Types

Types which are globally included in TypeScript

www.typescriptlang.org

2. Awaited<Type>

Awaited<Type>은 async 함수 내 await 나 Promise 객체들의 .then() 메소드와 같은 작업의 인터페이스를 모델링하기 위해 사용한다. 특징은, 중첩된 Promise 타입을 재귀적으로 풀어내어 리턴 타입을 얻어낼 수 있다는 것이다.

type B 처럼 Promise 타입이 중첩되어있어도 맨 바깥 쪽에 Awaited를 감싸면 최종 리턴 타입을 얻을 수 있다.

3. Partial<Type>

Partial<Type>은 Type 내 모든 프로퍼티들을 optional로 설정한다. 그래서 어떤 객체의 setter 등을 정의할 때 유용하게 사용할 수 있다.

4. Required<Type>

Required<Type>는 Partial<Type>과 정확히 반대되는 타입이다. Partial<Type>은 Type 내 프로퍼티들를 모두 optional로 설정하는 반면, Required<Type>은 모두 required로 설정한다. 인터페이스 정의 시 optional로 설정했던 프로퍼티들도 모두 required가 된다.

Required<Props> 타입인 obj2에 "b" 프로퍼티가 존재하지 않는 {a: 5}를 대입하려고 했기 때문에 에러가 발생한다.

5. Readonly<Type>

Readonly<Type>는 Type 내 모든 프로퍼티를 읽기전용으로 설정한다. 그래서 Readonly<Type>을 이용해 선언된 타입의 프로퍼티는 재할당이 이루어질 수 없다.

그리고 Object.freeze() 메소드를 이용하면 간편하게 Readonly<Type>가 랩핑된 객체를 얻을 수 있다.

6. Record<Keys,Type>

Record<Keys,Type>는 알아두면 정말 많이 활용할 수 있는 타입이다. Record<Keys,Type>은 key, value의 타입을 각각 Keys와 Type으로 하는 인터페이스를 정의한다.
만약 Page라는 문자열 리터럴 유니온 타입이 있고 PageInfo라는 인터페이스가 있을때,
어떤 임의의 객체를 선언할때 key가 Page 타입이고 value가 PageInfo이라면 다음과 같이 코드를 작성할 수 있다.

Record<Keys,Type>의 Keys는 문자와 숫자 리터럴 또는 심볼 유니온 타입이 될 수 있기 때문에 가변키 객체를 정의하는데 유용하게 활용할 수 있고, 위 예제에서 test 타입처럼 길게 작성하지 않아도 코드 한 줄 만으로 같은 효과를 볼 수 있다.

7. Pick<Type, Keys>

Pick<Type, Keys>는 Type이라는 인터페이스 내 프로퍼티들 중 Keys 라는 문자열 리터럴 유니온 타입에 매칭이 되는 키를 가진 프로퍼티만 선택해 새로운 타입을 생성한다.

8. Omit<Type,Keys>

Omit<Type,Keys>는 Pick<Type,Keys>와 정확히 반대되는 타입이다. Type이라는 인터페이스 내 프로퍼티들 중 Keys 라는 문자열 리터럴 유니온 타입에 매칭이 되는 키를 가진 프로퍼티만 빼고 새로운 타입을 생성한다.

9. Exclude<Type, ExcludedUnion>

Exclude<Type, ExcludedUnion>는 Type이라는 유니온 타입과 ExcludedUnion이라는 유니온 타입의 차집합을 새로운 타입으로 생성한다.

10. Extract<Type, Union>

Extract<Type, Union>는 Type이라는 유니온 타입과 Union이라는 유니온 타입의 교집합을 새로운 타입으로 생성한다.

11. NonNullable<Type>

NonNullable<Type>은 Type이라는 유니온 타입 내 null과 undefined를 제외하고 새로운 타입을 생성한다.
이때, Type에 포함된 타입이 null과 undefined 밖에 없을 경우 NonNullable이 리턴하는 타입은 never가 된다.

나머지 타입들은 다음 포스트에서 다룬다.

 

[Typescript] 유틸리티 타입 - 2

1. 서론 Typescript는 타입선언 시 활용할 수 있는 여러가지 유틸리티 타입이라는 것을 제공한다. 유틸리티 타입은 어떤 임의의 타입을 제네릭으로 받아 여러가지 형태로 쉽게 변형할 수 있도록 만

blog.betaman.kr

 

728x90
반응형