ν μ ν¬κΈ°λ‘ μλΌλ¨Ήλ νμ μ€ν¬λ¦½νΈ(TypeScript) κ°μ | μ΄μ ν Winterlood - μΈνλ°
μ΄μ ν Winterlood | , νλ‘ νΈμλμ νΌν μ μλ λμΈ νμ μ€ν¬λ¦½νΈ,μ΄μ λ μ λλ‘ μ 볡ν λκ° μμ΅λλ€! π [μ¬μ§]μΈνμ½ 2023 'νμ μ€ν¬λ¦½νΈλ μ κ·Έλ΄κΉ?' λ°νμμ κ°μμ λλ€. π§ λ°°μ
www.inflearn.com
π νμ μ€ν¬λ¦½νΈ μ΄ν΄νκΈ°
β λ¬Έλ²λ§ μΈμ°λ©΄ μΆ©λΆνμ§ μλ?
- μ²μμλ νμ μ€ν¬λ¦½νΈ λ¬Έλ²λ§ μΈμ λΉ λ₯΄κ² νλ‘μ νΈμ μ μ©ν μ μμ
- μ€μ λ‘ νμ μ€ν¬λ¦½νΈ 곡μ λ¬Έμλ λ¬Έλ² μ€μ¬μ cheat sheetsλ₯Ό μ 곡
- νμ§λ§ 볡μ‘ν μν©μμλ λ¬Έλ² μκΈ°λ‘λ νκ³μ λΆλͺνκΈ° μ¬μ
β λ¬Έλ²λ§ μΈμ μ λ μκΈ°λ λ¬Έμ
- 볡μ‘ν νμ μ μλ μμΈ μν©μ μ€μ€λ‘ λμ²νκΈ° μ΄λ €μ
- νμ μ€λ₯ ν΄κ²°μ μκ°μ μλ€ λ³΄λ©΄ μ½λκ° λλ¬μμ§κ³ μμ°μ±μ΄ λ¨μ΄μ§
- μ€μ λ‘ λ¬Έλ²λ§μΌλ‘ νλ‘μ νΈμ ν¬μ λλ€κ° μ€νλ € κ°λ° κΈ°κ°μ΄ λμ΄λ κ²½ν μμ
β κ·Έλμ μ μ리λ₯Ό λ°°μμΌ νλ?
- νμ μ€ν¬λ¦½νΈλ λ¨μν μΈμ΄κ° μλ
- νμ μ μ κΈ°μ€, νμ κ° κ΄κ³, μ€λ₯ κ²μ¬ λ°©μ λ± λμ μ리λ₯Ό μ΄ν΄ν΄μΌ μ€μ μμ μμ λ‘κ² νμ© κ°λ₯ν¨
- μλ‘μ΄ λ¬Έμ μμμλ μ¦κ²κ³ λ₯λμ μΌλ‘ ν΄κ²°ν μ μλ μ€λ ₯ κ°μΆκΈ°
π νμ μ μ§ν©μ΄λ€
β νμ μ μ§ν©μ΄λ€
- νμ
μ€ν¬λ¦½νΈμμ ‘νμ
’μ κ°λ€μ μ§ν©μ μλ―Έ
-> μ) number νμ : μ¬λ¬ μ«μλ₯Ό ν¬ν¨ν ν° μ§ν©
-> μ) number Literal νμ : μμ μ§ν© - number Literal νμ
(μ: 20)μ number νμ
(μ: μ«μ μ 체)μ λΆλΆ μ§ν©
-> 20 ⊆ number - νμ
κ°μλ μν κ΄κ³(ν¬ν¨ κ΄κ³)κ° μ‘΄μ¬ν¨
-> μμ νμ : μνΌ νμ (λΆλͺ¨ νμ )
-> νμ νμ : μλΈ νμ (μμ νμ )
β νμ νΈνμ±μ΄λ?
- λ νμ A, Bκ° μμ λ, A νμ μ κ°μ B νμ μ²λΌ μ¬μ©ν μ μλμ§ νλ¨νλ κ²
- μλΈ νμ
-> μνΌ νμ
: κ°λ₯ (μ
μΊμ€ν
)
-> μ) 20 (Number Literal) -> number : κ°λ₯ - μνΌ νμ
-> μλΈ νμ
: λΆκ°λ₯ (λ€μ΄μΊμ€ν
)
-> μ) number -> 20 : λΆκ°λ₯
β μ λ€μ΄μΊμ€ν μ λΆκ°λ₯ν κΉ?
- num1: number -> 10, 999, -5 λ± λͺ¨λ μ«μ κ°λ₯
- num2: 10 -> μ€μ§ 10λ§ κ°λ₯
- num1μ μ΄λ€ κ°μ΄ λ€μ΄ μλμ§ νμ ν μ μκΈ° λλ¬Έμ, νμ μμ μ± λ³΄μ₯μ μν΄ νμ μ€ν¬λ¦½νΈκ° κΈμ§
π νμ κ³μΈ΅λμ ν¨κ» κΈ°λ³Ένμ μ΄ν΄λ³΄κΈ°
// β
Unknown νμ
function unknownExam() {
// πΌ μ
μΊμ€ν
let a: unknown = 1;
let b: unknown = "hello";
let c: unknown = true;
let d: unknown = null;
let e: unknown = undefined;
// π½ λ€μ΄ μΊμ€ν
let unknownVar: unknown;
// let num: number = unknownVar;
// let str: string = unknownVar;
// let bool: boolean = unknownVar;
}
// β
Never νμ
function neverExam() {
function neverFunc(): never {
while (true) {}
}
// πΌ μ
μΊμ€ν
let num: number = neverFunc();
let str: string = neverFunc();
let bool: boolean = neverFunc();
// π½ λ€μ΄ μΊμ€ν
let never1: never;
// never1 = 10;
// never1 = "string";
// never1 = true;
}
// β
Void νμ
function voidExam() {
function voidFunc(): void {
console.log("void function!")
}
// πΌ μ
μΊμ€ν
let voidVar: void = undefined;
}
// β
any νμ
function anyExam() {
let unknownVar: unknown;
let anyVar: any;
let undefinedVar: undefined;
let neverVar: never;
// π anyλ νμ
κ³μΈ΅λ μμΈ → 무μμ΄λ μ
/λ€μ΄ μΊμ€ν
κ°λ₯
anyVar = unknownVar;
undefinedVar = anyVar;
// β μμΈ: neverλ μ΄λ€ νμ
μΌλ‘λ λ€μ΄μΊμ€ν
λΆκ°λ₯
// neverVar = anyVar;
}
π κ°μ²΄ νμ μ νΈνμ±
// β
κ°μ²΄ νμ
νΈνμ±
// λ κ°μ²΄ νμ
A, Bκ° μμ λ, A νμ
μ κ°μ B νμ
μ²λΌ μ¬μ©ν μ μλμ§ νλ¨
type Animal = {
name: string;
color: string;
};
type Dog = {
name: string;
color: string;
breed: string;
};
let animal: Animal = {
name: "κΈ°λ¦°",
color: "yellow",
};
let dog: Dog = {
name: "κ°λ§λ¦¬",
color: "white",
breed: "λ§ν°μ¦",
};
animal = dog; // πΌ μ
μΊμ€ν
// dog = animal; // π½ λ€μ΄ μΊμ€ν
type Book = {
name: string;
price: number;
};
type ProgrammingBook = {
name: string;
price: number;
skill: string;
};
let book: Book;
let programmingBook: ProgrammingBook = {
name: "ν μ
ν¬κΈ°λ‘ μλΌλ¨Ήλ νμ
μ€ν¬λ¦½νΈ",
price: 33000,
skill: "typescript",
};
book = programmingBook; // πΌ μ
μΊμ€ν
// programmingBook = book // π½ λ€μ΄ μΊμ€ν
// β
μ΄κ³Ό νλ‘νΌν° κ²μ¬
// κ°μ²΄ 리ν°λ΄μ μ§μ ν λΉν λλ νμ
μ μ μλμ§ μμ νλ‘νΌν°κ° μμΌλ©΄ μ€λ₯
let book2: Book = {
name: "ν μ
ν¬κΈ°λ‘ μλΌλ¨Ήλ νμ
μ€ν¬λ¦½νΈ",
price: 33000,
// skill: "typescript", // Book νμ
μλ skillμ΄ μκΈ° λλ¬Έμ μ€λ₯ λ°μ
}
// β
μ΄κ³Ό νλ‘νΌν° κ²μ¬λ₯Ό νΌνλ λ°©λ²
let book3: Book = programmingBook; // κ°μ²΄ 리ν°λ΄μ΄ μλ λ³μλ κ°μ²΄λ‘ μ λ¬νλ©΄ μ΄κ³Ό νλ‘νΌν° κ²μ¬κ° μ μ©λμ§ μμ
π λμ νμ
// β
λμ νμ
(Algebraic Types)
// μ¬λ¬ κ°μ νμ
μ μ‘°ν©ν΄ μλ‘μ΄ νμ
μ λ§λλ λ°©μ
// λνμ μΌλ‘ ν©μ§ν©(Union), κ΅μ§ν©(Intersection)μ΄ μ‘΄μ¬
// 1. ν©μ§ν© - Union νμ
// μ¬λ¬ νμ
μ€ νλλ§ ν΄λΉλλ©΄ ν λΉ κ°λ₯
let a: string | number | boolean;
a = 1;
a = "hello";
a = true;
// λ°°μ΄μμμ Union μμ
let arr: (number | string | boolean)[] = [1, "hello", true];
// κ°μ²΄ νμ
κ° Union μμ
type Dog = {
name: string;
color: string;
};
type Person = {
name: string;
language: string;
};
type Union1 = Dog | Person
let union1: Union1 = { name: "", color: "" }; // Dog νμ
κ°μ²΄
let union2: Union1 = { name: "", language: "" }; // Person νμ
κ°μ²΄
let union3: Union1 = { name: "", color: "", language: "" }; // Dog + Person ꡬ쑰λ νμ©
// let union4: Union1 = { name: "" }; // Dogλ Personλ μλ → μ€λ₯
// 2. κ΅μ§ν© - Intersection νμ
// κΈ°λ³Έ νμ
κ°μλ 곡ν΅λ λΆλΆμ΄ μμ΄ neverλ‘ μΆλ‘ λ¨
let variable: number & string; // μ‘΄μ¬ν μ μλ νμ
→ μ€λ₯
// κ°μ²΄ νμ
κ° Intersection μμ
type Intersection = Dog & Person;
// λ νμ
μ λͺ¨λ μμ±μ ν¬ν¨ν΄μΌ ν¨
let intersection: Intersection = {
name: "",
color: "",
language: "",
};
π νμ μΆλ‘
// β
νμ
μΆλ‘ (Type Inference)
// νμ
μ€ν¬λ¦½νΈλ νμ
μ΄ λͺ
μλμ§ μμ λ³μλ ννμμ νμ
μ μλμΌλ‘ μΆλ‘ ν¨
// λλΆμ λͺ¨λ λ³μμ νμ
μ μ§μ μμ±νμ§ μμλ μ½λλ₯Ό μμ±ν μ μμ
// 1. λ³μ μ μΈ μ μ΄κΈ°κ°μ ν΅ν΄ νμ
μΆλ‘
let a = 10; // νμ
μ numberλ‘ μΆλ‘ λ¨
let b = "hello"; // νμ
μ stringμΌλ‘ μΆλ‘ λ¨
let c = {
id: 1,
name: "κ°μ°μ",
profile: {
nickname: "κ°μ",
},
urls: ["https://isliife2.tistory.com/"],
};
// 2. ꡬ쑰 λΆν΄ ν λΉλ μΆλ‘ κ°λ₯
let { id, name, profile, urls } = c;
let [one, two, three] = [1, "hello", true];
// 3. ν¨μ λ°νκ°κ³Ό κΈ°λ³Έκ°μ΄ μλ λ§€κ°λ³μλ μΆλ‘ λ¨
function func(message = "hello") { // message: stringμΌλ‘ μΆλ‘
return "hello"; // λ°ν νμ
μ stringμΌλ‘ μΆλ‘ λ¨
}
// 4. μμμ any (Implicit any)
// νμ
μμ΄ μ μΈλ§ νκ³ μ΄κΈ°κ°μ΄ μμΌλ©΄ → μμμ μΌλ‘ any νμ
// μ΄ν ν λΉλ κ°μ λ°λΌ νμ
μ΄ λ³κ²½λ¨ ("anyμ μ§ν"λΌκ³ ν¨)
let d; // μ΄κΈ°μλ anyλ‘ μΆλ‘
d = 10; // μ΄νμ numberμ²λΌ λμ
d.toFixed();
d = "hello"; // μ΄νμ stringμ²λΌ λμ
d.toLowerCase();
// d.toFixed(); // νμ¬ dλ string νμ
μ΄λ―λ‘ μ€λ₯
// 5. constλ‘ μ μΈν λ³μμ νμ
μΆλ‘
const num = 10; // νμ
μ 10 (number 리ν°λ΄ νμ
)
const str = "hello"; // νμ
μ "hello" (string 리ν°λ΄ νμ
)
// 6. λ°°μ΄μ νμ
μΆλ‘
let arr = [1, "string"]; // (number | string)[] μΌλ‘ μΆλ‘ λ¨ (μ΅μ κ³΅ν΅ νμ
)
π νμ λ¨μΈ
// β
νμ
λ¨μΈ (Type Assertion)
// νμ
μ€ν¬λ¦½νΈκ° μΆλ‘ ν νμ
μ΄ μλ, νλ‘κ·Έλλ¨Έκ° μ§μ ν νμ
μΌλ‘ "λ¨μΈ"νλ λ¬Έλ² (λ¬Έλ²: κ° as νμ
)
type Person = {
name: string;
age: number;
};
let person = {} as Person; // λΉ κ°μ²΄λ₯Ό Person νμ
μΌλ‘ λ¨μΈ
person.name = "κ°μ°μ";
person.age = 24;
type Dog = {
name: string;
color: string;
};
let dog = {
name: "κ°λ§λ¦¬",
color: "white",
breed: "λ§ν°μ¦", // μ΄κ³Ό νλ‘νΌν°μ§λ§ λ¨μΈμ ν΅ν΄ 무μ κ°λ₯
} as Dog;
// β
νμ
λ¨μΈ κ·μΉ
// A as B → Aκ° Bμ μνΌνμ
μ΄κ±°λ μλΈνμ
μΌ λλ§ κ°λ₯
let num1 = 10 as never; // numberλ neverμ μνΌνμ
let num2 = 10 as unknown; // numberλ unknownμ μλΈνμ
// let num3 = 10 as string; // numberμ stringμ κ΄λ ¨ μμ → μ€λ₯
// β
const λ¨μΈ
// κ°μ 리ν°λ΄ νμ
λλ readonly νλ‘νΌν°λ‘ κ³ μ μν΄
let num4 = 10 as const; // νμ
: 10 (리ν°λ΄ νμ
)
let cat = {
name: "μΌμΉμ΄",
color: "yellow",
} as const; // λͺ¨λ νλ‘νΌν°κ° readonly + 리ν°λ΄ νμ
μΌλ‘ κ³ μ λ¨
// β
Non Null λ¨μΈ
// κ°μ΄ null λλ undefinedκ° μλμ λ¨μΈ
type Post = {
title: string;
author?: string;
};
let post: Post = {
title: "κ²μκΈ 1",
author: "κ°μ°μ",
}
const len: number = post.author!.length; // !λ₯Ό λΆμ΄λ©΄ "null/undefined μλ"μΌλ‘ λ¨μΈ
π νμ μ’νκΈ°
// β
νμ
μ’νκΈ° (Type Narrowing)
// νλμ λμ νμ
(μ λμ¨ λ±)μ 쑰건문 λ±μ ν΅ν΄ λ ꡬ체μ μΈ νμ
μΌλ‘ "μ’νμ" μ¬μ©νλ λ°©λ²
// typeof, instanceof, in μ°μ°μλ₯Ό νμ©ν΄ νμ
μ μ’ν μ μμ
type Person = {
name: string;
age: number;
}
function func(value: number | string | Date | null | Person) {
// value.toFixed();
// value.toUpperCase();
if (typeof value === "number") { // β
νμ
κ°λ μ¬μ©: typeof
console.log(value.toFixed());
} else if (typeof value === "string") { // β
νμ
κ°λ μ¬μ©: typeof
console.log(value.toUpperCase());
} else if (value instanceof Date) { // β
νμ
κ°λ μ¬μ©: instanceof (λ΄μ₯ ν΄λμ€μλ§ μ¬μ© κ°λ₯)
console.log(value.getTime());
} else if (value && "age" in value) { // β
νμ
κ°λ μ¬μ©: in (μ¬μ©μ μ μ νμ
νμΈμ μ μ©)
console.log(`${value.name}μ ${value.age}μ΄ μ
λλ€`);
}
}
π μλ‘μ μ λμ¨ νμ
// β
μλ‘μ μ λμ¨ νμ
(Discriminated Union)
// μλ‘ κ²ΉμΉμ§ μλ (κ΅μ§ν©μ΄ μλ) νμ
λ€λ‘ μ΄λ£¨μ΄μ§ μ λμ¨ νμ
// κ° νμ
μ ꡬλΆν μ μλ κ³ μ ν 리ν°λ΄ κ°(tag, state λ±)μ ν¬ν¨νλ κ²μ΄ νΉμ§
// 1. μ μ μν μμ
type Admin = {
tag: "ADMIN";
name: string;
kickCount: number;
};
type Member = {
tag: "MEMBER";
name: string;
point: number;
};
type Guest = {
tag: "GUEST";
name: string;
visitCount: number;
};
// μλ‘μ μ λμ¨ νμ
: κ³΅ν΅ νλ(tag)λ₯Ό κΈ°μ€μΌλ‘ νμ
μ μμ νκ² κ΅¬λΆν μ μμ
type User = Admin | Member | Guest;
function login(user: User) {
switch (user.tag) {
case "ADMIN": {
console.log(`${user.name}λ νμ¬κΉμ§ ${user.kickCount}λͺ
κ°ν΄νμ΅λλ€.`);
break;
}
case "MEMBER": {
console.log(`${user.name}λ νμ¬κΉμ§ ${user.point}μ λͺ¨μμ΅λλ€.`);
break;
}
case "GUEST": {
console.log(`${user.name}λ νμ¬κΉμ§ ${user.visitCount}λ² λ°©λ¬Ένμ
¨μ΅λλ€.`);
break;
}
}
}
// 2. λΉλκΈ° μμ
μ²λ¦¬ μμ
type LoadingTask = {
state: "LOADING";
};
type FailedTask = {
state: "FAILED";
error: {
message: string;
};
};
type SuccessTask = {
state: "SUCCESS";
response: {
data: string;
};
}
// κ³΅ν΅ νλ‘νΌν°μΈ stateλ₯Ό κΈ°μ€μΌλ‘ κ΅¬λΆ κ°λ₯ν μλ‘μ μ λμ¨ νμ
type AsyncTask = LoadingTask | FailedTask | SuccessTask;
function processResult(task: AsyncTask) {
switch (task.state) {
case "LOADING": {
console.log("λ‘λ© μ€");
break;
}
case "FAILED": {
console.log(`μλ¬ λ°μ: ${task.error.message}`);
break;
}
case "SUCCESS": {
console.log(`μ±κ³΅: ${task.response.data}`);
break;
}
}
}
β¬οΈ λ€μ λ΄μ©μ μλ κΈμ μ°Έκ³
μΈνλ° κ°μ - ν μ ν¬κΈ°λ‘ μλΌλ¨Ήλ νμ μ€ν¬λ¦½νΈ (ν¨μμ νμ )
λ‘λλ§΅ λ§ν¬ : https://link.onebitefe.com/r/5cdagwμλ¦¬μ¦ κ°μ λ§ν¬> ν μ ν¬κΈ°λ‘ μλΌλ¨Ήλ 리μ‘νΈ :https://i" data-og-host="www.inflearn.com" data-og-source-url="https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%E
isliife2.tistory.com