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}>;