Record, Pick, Omit - 유틸리티 타입
Pick
/**
* Pick<T, K>
* -> 뽑다, 고르다
* -> 객체 타입으로부터 특정 프로퍼티만 딱 골라내는 그런 타입
*/
interface Post{
title: string;
tags: string[];
content: string;
thumbnailURL?: string;
}
type Pick<T, K extends keyof T> = {
// K extends 'title' | 'tags' | 'content' | 'thumbnailURL'
// 'title' | 'content' extends 'title' | 'tags' | 'content' | 'thumbnailURL'
[key in K] : T[key];
}
// title 과 content 프로퍼티만 골라줌
const legacyPost: Pick<Post, "title" | "content"> = {
title : "옛날 글",
content: "옛날 컨텐츠",
}
Omit
/**
* Omit<T, K>
* -> 생략하다, 빼다
* -> 객체 타입으로부터 특정 프로퍼티를 제거하는 타입
*/
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
// T = Post, K = 'title'
// Pick<Post, Exclude<keyof Post, 'title'>>
// Pick<Post, Exclude<'title' | 'content' | 'tags' | 'thumbnailURL', 'title'>> // 뒤에있는 타입을 앞에 타입에서 찾아 제거
// Pick<Post, 'content' | 'tags' | 'thumbnailURL' >
// title 프로퍼티만 제거함
const noTitlePost: Omit<Post, "title"> = {
content: "",
tags: [],
thumbnailURL: "",
}
Record
/**
* Record<K, V> -> 실무에서 자주사용
*/
type Record<K extends keyof any, V> = {
[key in K] : V;
}
type ThumbnailLegacy = {
large: {
url: string;
};
medium: {
url: string;
};
small: {
url: string;
};
watch : {
url: string;
}
}
// 위 코드를 아래처럼 한줄로 만들 수 있음
type Thumbnail = Record<"large" | "medium" | "small" | "watch", {url: string}>;