interface Post {
title: string;
tags: string[];
content: string;
thumbnailURL? string;
}
// 임시 저장된 게시글
const draft: Partial<Post> = {
title : '초안 제목',
content : '초안'
}
// Partial 타입 직접 구현
type Partial<T> = {
[key in keyof T] ?: T[key]
};
Required
특정 객체 타입의 모든 프로퍼티를 필수 프로퍼티로 바꿔주는 타입
const withThumbnailPost: Required<Post> = {
title: "한입 타스 후기",
tags: ["ts"],
content: "",
thumbnailUrl: "https://...",
};
// Required 타입 직접 구현
type Partial<T> = {
[key in keyof T]-?: T[key];
};
-?는 필드를 선택적(optional) 속성이 아닌 필수 속성으로 만든다. 즉, 원래 T 타입에 선택적 속성이 있다면, 이 타입에서는 선택성이 제거되어 필수 속성으로 변경된다.
Readonly
특정 객체 타입에서 모든 프로퍼티를 읽기 전용 프로퍼티로 만들어 주는 타입
const readonlyPost: ReadonlyPost<Post> = {
title: "보호된 게시글",
tags: [],
content: "",
};
// Readonly 직접 구현
type Readonly<T> = {
readonly [key in keyof T]-?: T[key];
};
Pick<T, K>
객체 타입으로부터 특정 프로퍼티만 골라내는 타입
interface Post {
title: string;
tags: string[];
content: string;
thumbnailURL?: string;
}
const legacyPost: Pick<Post, "title" | "content"> = {
title: "옛날 글",
content: "옛날 컨텐츠",
};
// Pick 타입 직접 구현
type Pick<T, K extends keyof T> = {
[key in K]: T[key];
};
// extends keyof T를 통해, T로 들어오는 객체의 속성만 들어올 수 있도록 제한
Omit<T, K>
객체 타입으로 부터 특정 프로퍼티를 제거하는 타입
interface Post {
title: string;
tags: string[];
content: string;
thumbnailURL?: string;
}
const noTitlePost: Omit<Post, "title"> = {
content: "",
tegs: [],
thumbnailURL: "",
};
// Omit 타입 직접 구현
type Omit<T, K extends keyof T> = Pick<T, Exclude<key of T, K>>;
Record<K, V>
객체 타입을 새롭게 정의할 때 인덱스 시그니처처럼 유연하지만, 조금 더 제한적인 객체타입을 정의
type ThumbnailLegacy = {
large: {
url: string;
};
medium: {
url: string;
};
small: {
url: string;
};
};
type Thumbnail = Record<"large" | "medium" | "small", { url: string }>;
// Record 타입 직접 구현
type Record<K extends keyof any, V> = {
[key in K]: V;
};
조건부 타입 기반
Exclude<T, U>
T에서 U를 제거하는 타입
type A = Exclude<string | boolean, boolean>;
// Exclude 직접 구현
type Exclude<T, U> = T Extends U ? never : T;
Extract<T, U>
T에서 U를 추출하는 타입
type B = Extract<string | boolean, boolean>;
// Extract 직접 구현
type Extract<T, U> = T extends U ? T : never;
ReturnType
함수의 반환값 다입을 추출하는 타입
function funcA() {
return "hello";
}
type ReturnA = ReturnType<typeof funcA>;
// ReturnType 직접 구현
type ReturnType<T extends (...arg: any) => any> = T extends (
...arg: any
) => infer R
? R
: never;