ν μ ν¬κΈ°λ‘ μλΌλ¨Ήλ νμ μ€ν¬λ¦½νΈ(TypeScript) κ°μ | μ΄μ ν Winterlood - μΈνλ°
μ΄μ ν Winterlood | , νλ‘ νΈμλμ νΌν μ μλ λμΈ νμ μ€ν¬λ¦½νΈ,μ΄μ λ μ λλ‘ μ 볡ν λκ° μμ΅λλ€! π [μ¬μ§]μΈνμ½ 2023 'νμ μ€ν¬λ¦½νΈλ μ κ·Έλ΄κΉ?' λ°νμμ κ°μμ λλ€. π§ λ°°μ
www.inflearn.com
π μ νΈλ¦¬ν° νμ μκ°
β μ νΈλ¦¬ν° νμ μ΄λ?
- νμ μ€ν¬λ¦½νΈκ° λ΄μ₯μΌλ‘ μ 곡νλ νΉμν νμ λͺ¨μ
- μ λ€λ¦, μ‘°κ±΄λΆ νμ , λ§΅λ νμ λ± κΈ°μ΄ νμ μ‘°μ κΈ°λ₯λ€μ μ‘°ν©ν΄ μ€λ¬΄μμ μμ£Ό μ°μ΄λ ννλ‘ κ΅¬μ±
- μ¦, μμ£Ό λ°λ³΅λλ ν¨ν΄μ κ°νΈνκ² μ μ©ν μ μλλ‘ λ§λ€μ΄μ§ μ¬μ¬μ© κ°λ₯ν νμ λꡬ
π λ§΅λ νμ κΈ°λ°μ μ νΈλ¦¬ν° νμ 1 - Partial, Required, Readonly
// β
Partial<T>
// λΆλΆμ μΈ, μΌλΆλΆμ
// νΉμ κ°μ²΄ νμ
μ λͺ¨λ νλ‘νΌν°λ₯Ό 'μ νμ νλ‘νΌν°'λ‘ λ°κΏμ£Όλ μ νΈλ¦¬ν° νμ
interface Post {
title: string;
tags: string[];
content: string;
thumbnailURL?: string;
};
// μ§μ ꡬν
type Partial<T> = {
[key in keyof T]?: T[key];
};
// μμ: μμ μ μ₯μ© κ²μκΈμ μΌλΆ νλ‘νΌν°λ§ μμ΄λ λ¨
const draft: Partial<Post> = {
title: "μ λͺ© λμ€μ μ§μ",
content: "μ΄μ...",
};
// β
Required<T>
// νμμ, νμμ μΈ
// νΉμ κ°μ²΄ νμ
μ λͺ¨λ νλ‘νΌν°λ₯Ό 'νμ νλ‘νΌν°'λ‘ λ°κΏμ£Όλ μ νΈλ¦¬ν° νμ
// μ§μ ꡬν
type Required<T> = {
[key in keyof T]-?: T[key];
};
// μμ: μΈλ€μΌμ΄ λ°λμ ν¬ν¨λμ΄μΌ νλ κ²μκΈ
const withThumbnailPost: Required<Post> = {
title: "νμ
νμ€ νκΈ°",
tags: ["ts"],
content: "",
thumbnailURL: "https://...",
};
// β
Readonly<T>
// μ½κΈ° μ μ©, μμ λΆκ°
// νΉμ κ°μ²΄ νμ
μ λͺ¨λ νλ‘νΌν°λ₯Ό 'μ½κΈ° μ μ© νλ‘νΌν°'λ‘ λ°κΏμ£Όλ μ νΈλ¦¬ν° νμ
// μ§μ ꡬν
type Readonly<T> = {
readonly [key in keyof T]: T[key];
}
// μμ: μμ μ΄ κΈμ§λ λ³΄νΈ κ²μκΈ
const readonlyPost: Readonly<Post> = {
title: "보νΈλ κ²μκΈ μ
λλ€.",
tags: [],
content: "",
};
π λ§΅λ νμ κΈ°λ°μ μ νΈλ¦¬ν° νμ 2 - Pick, Omit, Record
// β
Pick<T, K>
// λ½λ€, κ³ λ₯΄λ€
// κ°μ²΄ νμ
μμ νΉμ keyλ§ κ³¨λΌ μλ‘μ΄ κ°μ²΄ νμ
μ μμ±
interface Post {
title: string;
tags: string[];
content: string;
thumbnailURL?: string;
};
// μ§μ ꡬν
type Pick<T, K extends keyof T> = {
[key in K]: T[key];
}
// μμ: μ€λλ κΈμλ νκ·Έλ μΈλ€μΌμ΄ μλ€κ³ κ°μ
const legacyPost: Pick<Post, "title" | "content"> = {
title: "μλ κΈ",
content: "μλ 컨ν
μΈ ",
}
// β
Omit<T, K>
// μλ΅νλ€, λΉΌλ€
// κ°μ²΄ νμ
μμ νΉμ keyλ§ μ κ±°ν λλ¨Έμ§λ‘ ꡬμ±λ νμ
μ μμ±
// μ§μ ꡬν
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
const noTitlePost: Omit<Post, "title"> = {
content: "",
tags: [],
thumbnailURL: "",
};
// β
Record<K, V>
// λμΌν ꡬ쑰λ₯Ό κ°λ κ°μ²΄ νμ
μ λΉ λ₯΄κ² μμ±
// key λͺ©λ‘(K)μ κΈ°μ€μΌλ‘ κ° keyμ λμΌν value νμ
(V)μ λΆμ¬
// μ§μ ꡬν
type Record<K extends keyof any, V> = {
[key in K]: V;
};
// μμ: μΈλ€μΌ μ νλ³ μμ± μ μ
type Thumbnail = Record<"large" | "medium" | "small | watch", { url: string, size: number }>;
π μ‘°κ±΄λΆ νμ κΈ°λ°μ μ νΈλ¦¬ν° νμ - Exclude, Extract, ReturnType
// β
Exclude<T, U>
// μ μΈνλ€, μΆλ°©νλ€
// μ λμ¨ νμ
Tμμ Uμ ν΄λΉνλ νμ
λ§ μ κ±°
// μ§μ ꡬν
type Exclude<T, U> = T extends U ? never: T;
type A = Exclude<string | boolean, boolean>;
// λΆμ° μ‘°κ±΄λΆ νμ
μΌλ‘ νκ°λ¨
// Exclude<string>; // => string
// Exclude<boolean>; // => never
// λ°λΌμ Aλ string
// β
Extract<T, U>
// μΆμΆνλ€, λ½μλ΄λ€
// μ λμ¨ νμ
Tμμ Uμ ν΄λΉνλ νμ
λ§ μΆμΆ
// μ§μ ꡬν
type Extract<T, U> = T extends U ? T : never;
type B = Extract<string | boolean, boolean>;
// λΆμ° μ‘°κ±΄λΆ νμ
μΌλ‘ νκ°λ¨
// Extract<string>; // => never
// Extract<boolean>; // => boolean
// λ°λΌμ Bλ boolean
// β
ReturnType<T>
// ν¨μμ λ°νκ° νμ
μ μΆμΆνλ μ νΈλ¦¬ν° νμ
// μ§μ ꡬν
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R: never;
function funcA() {
return "hello";
}
function funcB() {
return 10;
}
type ReturnA = ReturnType<typeof funcA>; // string
type ReturnB = ReturnType<typeof funcB>; // number