본문 바로가기
Web development/Node.js & Typescript

[Typscript] 유틸리티 타입 - Partial, Readonly, Record

by 자몬다 2020. 7. 21.

Partial<T>

일부의 속성만 가질 수 있을 때 사용한다. 예를 들어 게시글 인터페이스엔 제목, 글쓴이, 내용 등등이 있을 것이다. 

게시글 수정시 항상 모든 필드를 수정하지는 않는다. 게시글에 포함된 프로퍼티 중 일부의 프로퍼티(하위 타입 집합)만 사용하고 싶을 때 사용할 수 있다.  

interface Post {
    title: string;
    author: string;
    content: string;
    isHidden: boolean;
}

// 게시글을 작성한다.
const newPost = {
	title: 'hello world',
    author: 'effy',
    content: 'hello',
    isHidden: false,
}

// 수정하고 싶어졌다. 제목만 바꿀수도 있고, 내용만 바꿀수도 있고, 다 바꿀수도 있다.
function update(post: Post, payload: Partial<Post>) {
	return {...post, ...payload}
}

update(newPost, {title: 'hi world', isHidden: true})
/**
{
	title: 'hi world',
    author: 'effy',
    content: 'hello',
    isHidden: true,
}
*/

 

Readonly<T>

이름에서 알 수 있듯, 읽기 전용으로 정의한다. 재할당이 불가능해지며, 재할당시 에러를 리턴한다.

interface Person {
  name: string;
}

const effy: Readonly<Person> = {name: 'effy'};

effy.name = 'moro'; // Error

 

Record<K, T>

공통 타입(T)을 가진 특정 프로퍼티(K) 타입들을 정의할 수 있다. 

interface Spec {
  legs: number;
  wings: boolean;
}

type Animal = 'cat' | 'bird' | 'fish';

const animalSpecs: Record<Animal, Spec> = {
  cat: {legs: 4, wings: false},
  bird: {legs: 2, wings: true},
  fish: {legs: 0, wings: false},
}

Partial과 함께 써서 다양하지만 비슷한 모델들에 대해 유연한 타입을 만들 수도 있을 것 같다.

댓글