[한입] 맵드타입 기반 유틸리티 타입들2

TK·2023년 12월 22일
0

[강의] 한입 시리즈

목록 보기
59/59
post-custom-banner

✏️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' 
    // number extends 'title'|'tags'|'content'|'thumbnailURL' ❌
  [key in K]: T[key];
};

const legacyPost: Pick<Post, "title" | "content"> = {
  title: "옛날 글",
  content: "옛날 컨텐츠",
};

✏️Pick<T, K>

  • 객체타입으로부터 특정 프로퍼티만 딱 골라내는 타입
interface Post {
  title: string;
  tags: string[];
  content: string;
  thumbnailURL?: string;
}

// 직접구현
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'|'tags'|'content'|'thumbnailURL', 'title'>>
// Pick<Post, 'tags'|'content'|'thumbnailURL'>


// 제목이 없는 글
const noTitlePost: Omit<Post, "title"> = {
  content: "",
  tags: [],
  thumbnailURL: "",
};

✏️Record<K, V>

  • 다음과 같이 버전마다 같은 프로퍼티객체를 갖는다면, 그 버전이 추가되거나 프로퍼티 이름이 바뀔때 일일히 수정하기 번거롭다. (+코드중복)
type ThumbnailLegacy = {
  large: {
    url: string;
  };
  medium: {
    url: string;
  };
  small: {
    url: string;
  };
  watch: {
    url: string;
  };
  ...
};
  • 다음의 유틸리티 타입을 사용할 수 있다.
// 직접구현
type Record<K extends keyof any, V> = {
  [key in K]: V;
};

type Thumbnail = Record<
  "large" | "medium" | "small" | "watch",
  { url: string }
>;

→ 실무에서 많이 사용된다.
→ 동일한 패턴을 갖는 객체 타입을 쉽게 정의할 수 있다.

profile
쉬운게 좋은 FE개발자😺
post-custom-banner

0개의 댓글