유틸리티 타입(Utility Types)은 하나의 type을 다양하게 변형하여 새로운 타입을 생성하는 것이다.
그 중 가장 대표적인 유틸리티 타입들을 알아보자.
1. Index Type
기존 타입의 key 또는 value에 접근하여 타입을 생성한다.
아래는 age와 gender 요소를 갖는 Animal 타입을 활용하여 다른 타입을 생성하는 예시이다.
type Animal = {
age: number;
gender: 'male' | 'female';
};
type Age = Animal['age']; // number
type Keys = keyof Animal; // 'age' | 'gender'
type Person = {
name: string;
age: number;
gender: Animal['gender']; // 'male' | 'famale'
}
2. Partial Type
기존 타입의 요소들을 모두 옵셔널로 바꿔서 새로운 타입을 생성한다.
아래는 할 일을 담는 Todo 타입에 Partial Type을 적용한 예시이다.
type Todo = {
title: string;
desc: string;
priority: 'high' | 'low';
}
type TodoOptional = Partial<Todo>;
결과적으로 TodoOptional은 아래와 같이 정의된다.
{
title?: string;
desc?: string;
priority?: 'high' | 'low';
}
Partial Type은 아래와 같이 활용될 수 있다.
const updateTodo = (todo: Todo, fieldsToUpdate: Partial<Todo>): Todo {
return { ...todo, ...fieldsToUpdate };
}
const todo: Todo = {
title: 'study TypeScript',
desc: 'study hard',
priority: 'high',
};
const todo2 = updateTodo(todo, { priority: 'low' }); // 두 번째 인자는 Partial<Todo> 타입을 따른다.
3. Readonly Type
기존 타입의 요소들을 모두 읽기전용 (수정불가) 상태로 바꾼 새 타입을 생성한다.
위의 Todo 타입에 Readonly Type을 적용한 예시이다.
const displayTodo = (todo: Readonly<Todo>): void => {
todo.title = 'hello'; // error
}
4. Pick Type과 Omit Type
Pick Type은 기존 타입의 몇몇 요소만 골라서 새로운 타입을 생성한다.
Omit Type은 기존 타입의 몇몇 요소만 제외하고 나머지 요소들로 새로운 타입을 생성한다.
아래는 여러 정보를 갖는 Video 타입으로부터 VideoMetadata라는 새로운 타입을 생성하는 예시이다.
type Video = {
id: string;
title: string;
url: string;
data: string;
}
type VideoMetadata1 = Pick<Video, 'id'|'title' >;
type VideoMetadata2 = Omit<Video, 'url'|'data' >;
결과적으로 VideoMetadata1과 2는 같은 타입이다.
'TypeScript' 카테고리의 다른 글
TypeScript 컴파일하기 (tsconfig의 이해) (0) | 2021.04.18 |
---|---|
[TypeScript] 인터섹션 타입 Intersection Type (0) | 2021.04.17 |
[TypeScript] Type Alias와 Interface 비교 (0) | 2021.04.16 |
[TypeScript] 제네릭을 사용하는 이유 (0) | 2021.04.15 |
TypeScript로 이해하는 객체지향 (0) | 2021.04.14 |