프로그래밍 언어/JS TS

Typescript 유틸리티 타입 탐방하기

트리맨스 2022. 7. 30. 23:20
반응형

 

타입스크립트에서는 타입을 정의하고, 이를 유연하게 다루고 재가공하기 위한 다양한 기법이 있다. 이 중 타입스크립트에서는 기본적으로 제공되는 몇 가지의 유틸리티 타입이 있다. 공부 목적으로 간단히 정리해 보려고 한다.

 

입문


타입과 관련된 내용을 유연하게 다루기 위한 기초 문법(키워드)을 간단히 정리해 보려고 한다.

 

유니온 타입 (Union Type)

가능한 타입들의 종류를 나열한 타입이다. OR연산자로 묶여 있다.

// a는 number 또는 string 만 될 수 있다. typeof a 로 타입 판별 가능
let a: number | string

 

keyof 

타입에 존재하는 모든 key 값들을 union 형태로 반환한다.

type Point = { x: number; y: number };
// P는 'x' 또는 'y' 밖에 될 수 없음
type P = keyof Point;

type Mapish = { [k: string]: boolean };
// M은 string | number 밖에 될 수 있음. 객체 키는 항상 string으로 반환되기 때문
type M = keyof Mapish;

 

typeof

특정 변수 또는 오브젝트의 타입을 반환함.

 

조건부 타입 (Conditional Types)

조건부 검사에 의해서 입력과 출력 타입간의 관계를 정의할 수 있다. 현대 유용한 프로그램에서는 입력에 따라서 출력이 결정되어야 한다는 타입스크립트의 생각에서 비롯된 기능이라고 생각된다.

 

조건부 타입 : extends 예시

interface Animal {
  live(): void;
}
interface Dog extends Animal {
  woof(): void;
}

// extends : A extends B 일때 A가 B를 포함하는지?
// Example1 은 Dog이 Animal을 포함하고 있으니 number 타입
type Example1 = Dog extends Animal ? number : string;
// Example2는 RedExp이 Animal을 포함하고 있지 않으니 string 타입
type Example2 = RegExp extends Animal ? number : string;

 

조건부 타입 : infer 예시

// T는 아무 인자나 받을 수 있는 함수이다. 이 함수의 반환값의 타입을 R이라고 하고, T가 함수의 반환값이면 반환값 R을 쓰고, 아니면 T를 사용한다.
type GetReturnType<T> = T extends (...args: any) => infer R ? R : T;

// number
type Num_ = GetReturnType<number>;

// number
type Num = GetReturnType<() => number>;

// string
type Str = GetReturnType<(x: string) => string>;

// boolean[]
type Bools = GetReturnType<(a: boolean, b: boolean) => boolean[]>;

 

매핑 수정자 (Mapping Modifiers)

// 타입의 모든 프로퍼티에서 readonly 속성을 제거
type CreateMutable<Type> = {
  -readonly [Property in keyof Type]: Type[Property];
};
 
type LockedAccount = {
  readonly id: string;
  readonly name: string;
};
 
// LockedAccount에서 모든 readonly 속성 제거
type UnlockedAccount = CreateMutable<LockedAccount>;

 

 

시작하기


Typescript에서 기본적으로 제공하는 유틸리티 타입을 위주로 확인해보자.

 

Partial<Type>

Type의 모든 프로퍼티를 nullable로 변환

// 모든 속성들을 nullable로 지정하여 반환한다.
type Partial<T> = { [P in keyof T]?: T[P]; };

 

Required<Type>

Type의 모든 프로퍼티를 not nullable로 변환

// T의 모든 프로퍼티들에서 모든 ? 속성을 제거 후 반환한다.
type Required<T> = { [P in keyof T]-?: T[P] };

 

Readonly<Type>

Type의 모든 프로퍼티에 readonly 속성을 적용한다.

// 모든 속성에 readonly 붙여서 반환
type Readonly<T> = { readonly [P in keyof T]: T[P]; };

 

Record<K, T>

K를 키 타입으로, T를 value 타입으로 사용하는 새 오브젝트 타입

// K는 key값(들)로, T는 value 타입으로 사용한다
type Record<K extends keyof any, T> = { [P in K]: T };

 

Pick<T, K>

T에서 K 집합을 선택하여 타입 생성

// K는 T의 key값들의 union, 반환값은 key: K의 값들, value: T[P]
type Pick<T, K extends keyof T> = { [P in K]: T[P] };

 

Omit<T, K>

T에서 K를 제외한 타입을 생성

// T에서 K를 제외한 값을 Pick해서 반환한다.
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

 

이거 외에도 이것저것 많이 있다... 자세한 내용은 공식 문서를 참고하면 좋을 것 같다. 여기에다 이러한 타입들에 대해서 공부할 수 있는 사이트도 있던 것 같았다.

 

참고자료


https://www.typescriptlang.org/ko/docs/handbook/utility-types.html

 

Documentation - Utility Types

Types which are globally included in TypeScript

www.typescriptlang.org

https://github.com/type-challenges

 

GitHub: Where the world builds software

GitHub is where over 83 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

 

 

반응형

'프로그래밍 언어 > JS TS' 카테고리의 다른 글

JSON 데이터 엑셀로 저장하기  (0) 2022.09.25
JS 코딩테스트 준비하기  (0) 2022.09.24
Object 전체 순회하기  (0) 2022.07.13
TS 데코레이터  (0) 2021.09.15
TS 클래스 다중 상속하기  (0) 2021.09.11