π― 10λΆ ν¬μλ‘ Typescript νμ μ€ν¬λ¦½νΈ μ 볡
μ€λ κ°λ°μ
@loxo
24μΌ μ
π― 10λΆ κ°μλ‘ νμ μ€ν¬λ¦½νΈ μ 볡
μμμ΄ λ°μ΄λ€ (50%)
κ±°μ μ€λ¬΄μ μ
μ₯μμ 보μμ λ μ΄κ² μ΄μμ μ΄κ³ μμ μμμ΄λΌκ³ μκ°ν©λλ€.
κ·Έλ¬λ μ΄ μ λλ κΈ°μ΅νκ³ μμ΄μΌ ν©λλ€. λ°λ³΅ν μλ°μ μμ΅λλ€.
νΉν κ°λ°μλ€μ΄ falsy 쑰건μ λͺ°λΌ ifλ¬Έμ κΈ°μ€ μμ΄ λ¨λ°νκ³ μμ΄μ. μ λ§ μ€μν©λλ€.
if (!variable), if(variable)λ‘ κ°λ¨ν ν μ μλ κ²λ μ리λ₯Ό λͺ°λΌμ κ·Έλ λ€κ³ μκ°μ΄ λ©λλ€.
0οΈβ£ κ°μ ν μ€ μμ½ (30μ΄)
- νμ μ€ν¬λ¦½νΈλ μ μΈμ΄κ° μλλ€
- μλ°μ€ν¬λ¦½νΈ μ½λμ νμ μ λΆμΈ κ²μ΄ μ λΆλ€
- νμ
μ μ€νμ λ°κΎΈμ§ μκ³ ,
π μ€μμ λ²κ·Έλ₯Ό βμμ± μ€βμ μ‘μμ€λ€
1οΈβ£ κ°μ₯ λ¨Όμ μμμΌ ν κ²: if λ¬Έκ³Ό boolean (1λΆ)
β μλ°μ€ν¬λ¦½νΈμ νμ€
if (value) {
// trueμΌ μλ, falseμΌ μλ, λ¬Έμμ΄μΌ μλ, μ«μμΌ μλβ¦
}β if λ¬Έμμ falseλ‘ νκ°λλ λͺ¨λ 쑰건 (Falsy κ°)
μλ°μ€ν¬λ¦½νΈ / νμ
μ€ν¬λ¦½νΈμμ if (value)κ° falseκ° λλ κ°μ μλλ‘ κ³ μ λμ΄ μλ€.
false
0
-0
0n // BigInt zero
"" // λΉ λ¬Έμμ΄
null
undefined
NaNπ μ΄ κ°λ€λ§ falseμ΄κ³ , λλ¨Έμ§λ μ λΆ true (Truthy)
β μ€λ¬΄μμ κ°μ₯ λ§μ΄ ν°μ§λ λ²κ·Έ
if (user.age) {
// ageκ° 0μ΄λ©΄ μ¬κΈ° μ€ν μ λ¨ β
}if (user.name) {
// nameμ΄ ""(λΉ λ¬Έμμ΄)μ΄λ©΄ false β
}β νμ μ€ν¬λ¦½νΈμ ν΅μ¬ ν΄κ²° λ°©μ
if (user.age !== null && user.age !== undefined) {
// 0λ μ μ κ°μΌλ‘ μ²λ¦¬ β
}if (user.name !== undefined) {
// λΉ λ¬Έμμ΄ νμ© μ¬λΆλ₯Ό λͺ
νν νλ¨
}boolean νμ μ μμ ν λ€λ₯΄λ€
const isLoggedIn: boolean = false;
if (isLoggedIn) {
// μ€μ§ trueμΌ λλ§ μ€ν
}π boolean νμ μ falsy κ°λ μ΄ μλλΌ true / falseλ§ μ‘΄μ¬
π₯ μ€λ¬΄ ν΅μ¬ ν¬μΈνΈ
if (value)λ κ° κ²μ¬ + νμ κ²μ¬λ₯Ό λμμ νλ€- μ«μ, λ¬Έμμ΄μ κ·Έλλ‘ μ°λ©΄ μννλ€
- null / undefined 체ν¬λ νμ λͺ μμ μΌλ‘
- 쑰건문μ λ―Ώκ³ μΆλ€λ©΄ π νμ λΆν° μ’νλΌ
2οΈβ£ κΈ°λ³Έ νμ : μ΄κ±°λ©΄ 80% λ (2λΆ)
μ λ§ μμ£Ό μ°λ κΈ°λ³Έ νμ
λͺ¨λ μλ¬Έμμ
λλ€. κΌ κΈ°μ΅νμΈμ
const userId: number = 1;
const userName: string = "kim";
const isActive: boolean = true;λ°°μ΄
const numbers: number[] = [1, 2, 3];
const names: string[] = ["kim", "lee"];κ°μ²΄ (inline)
const user: {
id: number;
name: string;
} = {
id: 1,
name: "kim",
};null / undefined
let value: string | null = null;π μ€λ¬΄μμλ κ±°μ νμ | nullμ μ¬μ©
3οΈβ£ ν¨μ νμ : μ€λ¬΄μμ μ μΌ μ€μ (2λΆ)
λ§€κ°λ³μ + λ°ν νμ
function add(a: number, b: number): number {
return a + b;
}νμ΄ν ν¨μ
const multiply = (a: number, b: number): number => {
return a * b;
};λ°νκ°μ΄ μμ λ
function log(message: string): void {
console.log(message);
}π₯ μ€λ¬΄ ν¬μΈνΈ
- ν¨μ μκ·Έλμ²λ§ λ΄λ λ¬΄μ¨ μν μΈμ§ λ°λ‘ μ μ μμ
- API, μ νΈ ν¨μμμ λ²κ·Έ κΈκ°
4οΈβ£ interface vs type (κ°μ₯ λ§μ΄ λ¬Όμ΄λ³΄λ μ§λ¬Έ) (2λΆ)
interface (κ°μ²΄ ꡬ쑰 μ μμ©)
interface User {
id: number;
name: string;
}type (λ λ²μ©μ )
type User = {
id: number;
name: string;
};μ°¨μ΄ ν΅μ¬ μμ½
| κ΅¬λΆ | interface | type |
|---|---|---|
| κ°μ²΄ μ μ | β μ΅μ | β κ°λ₯ |
| νμ₯ | extends | & |
| μ λμ¨ νμ | β | β |
| μ€λ¬΄ μ¬μ© λΉλ | λ§€μ° λμ | λ§€μ° λμ |
νμ₯ λΉκ΅
interface Admin extends User {
role: string;
}type Admin = User & {
role: string;
};β μ€λ¬΄ κΈ°μ€ μΆμ²
- κ°μ²΄ ꡬ쑰 β interface
- μ λμ¨ / μ‘°ν© β type
5οΈβ£ μ λμ¨ νμ : νμ μ€ν¬λ¦½νΈμ μ§μ§ ν (1.5λΆ)
type Status = "loading" | "success" | "error";
let status: Status = "loading";μ‘°κ±΄λ¬Έμ΄ μμ ν λ¬λΌμ§λ€
if (status === "success") {
// μ¬κΈ°μ success νμ
}π λ¬Έμμ΄ λΉκ΅κ° μλλΌ βνμ λΉκ΅β
6οΈβ£ μ€λ¬΄ μ΅λΉλ ν¨ν΄: optional (?) + 쑰건문 (1λΆ)
1οΈβ£ optional property (?) β κ°μ΄ μμ μλ μλ€λ μ μΈ
interface User {
id: number;
name?: string; // μμ΄λ λκ³ , μμ΄λ λλ€
}π name?: stringμ μ§μ§ μλ―Έλ μλμ κ°λ€
name: string | undefined2οΈβ£ optional + if λ¬Έ (νμ μ’νκΈ°)
if (user.name) {
// μ¬κΈ°μλ nameμ΄ stringμΌλ‘ νμ
}β οΈ λ¨, λΉ λ¬Έμμ΄ ""μ falseκ° λλ€
if (user.name !== undefined) {
// λΉ λ¬Έμμ΄λ μ μ κ°μΌλ‘ μΈμ
}3οΈβ£ optional chaining (?.) β μ€λ¬΄μμ μ§μ§ λ§μ΄ μ
user.profile?.imageUrlπ₯ μ€λ¬΄ ν΅μ¬ ν¬μΈνΈ
?λ κ°μ΄ μμ μ μμμ λ¬Έμλ‘ κ³ μ νλ λꡬ- optionalμ λλΆλΆ λ°±μλ μλ΅ / μΈλΆ λ°μ΄ν°μμ μ¬μ©
- optionalμ μ°λ μκ° π if 쑰건μ λ μ μ€ν μ¨μΌ νλ€
6οΈβ£-1οΈβ£ if falsy μ€λ¬΄ ν¨ν΄ μμ½ (μμ£Ό μ°λ κ²λ§)
βοΈ ν¨ν΄ 1: κ° μ‘΄μ¬ μ¬λΆλ§ νμΈ (early return)
if (!value) return;null,undefined,"",0λͺ¨λ κ±°λ₯Έλ€- UI μ΄λ²€νΈ, κ°λ λ‘μ§μμ κ°μ₯ νν¨
βοΈ ν¨ν΄ 2: null / undefined λ§ μ²΄ν¬ (μ€λ¬΄ μ΅μ€μ)
if (value == null) return;nullλλundefinedλ§0,"",falseλ ν΅κ³Ό
βοΈ ν¨ν΄ 3: optional κ° μ κ·Ό
if (user.profile?.imageUrl) {
// imageUrl μμ λλ§
}7οΈβ£ μ€λ¬΄ νμ λ΄μ₯ νμ (Utility Types) (2λΆ)
νμ μ€ν¬λ¦½νΈμλ μ€λ¬΄μμ λ§€μΌ μ°λ λ΄μ₯ νμ μ΄ μ΄λ―Έ μ€λΉλμ΄ μλ€.
1οΈβ£ Partial β μ λΆ optionalλ‘ λ§λ€κΈ°
interface User {
id: number;
name: string;
email: string;
}
type UserUpdate = Partial<User>;π PATCH API, μμ νλ©΄μμ νμ
2οΈβ£ Omit<T, K> β νΉμ νλ μ κ±°
type UserWithoutId = Omit<User, "id">;3οΈβ£ Pick<T, K> β νμν κ²λ§ μ ν
type UserPreview = Pick<User, "id" | "name">;4οΈβ£ Required β optional μ κ±°
type RequiredUser = Required<User>;5οΈβ£ Record<K, T> β key/value κ°μ²΄λ₯Ό κ°μ₯ μμ νκ²
type Role = "admin" | "user" | "guest";
type RoleLabelMap = Record<Role, string>;
const ROLE_LABEL: RoleLabelMap = {
admin: "κ΄λ¦¬μ",
user: "μΌλ° μ¬μ©μ",
guest: "μλ",
};μλ―Έ:
- key μ§ν©μ νμ μΌλ‘ κ³ μ
- λΉ μ§ key, μλͺ»λ keyλ₯Ό μ»΄νμΌ λ¨κ³μμ μ°¨λ¨
β κ°μ²΄λ₯Ό κ·Έλ₯ μ°λ©΄ μκΈ°λ λ¬Έμ
const ROLE_LABEL = {
admin: "κ΄λ¦¬μ",
user: "μΌλ° μ¬μ©μ",
};
// guest λΉ μ Έλ μλ¬ μμ ββ Recordλ₯Ό μ°λ©΄
const ROLE_LABEL: Record<Role, string> = {
admin: "κ΄λ¦¬μ",
user: "μΌλ° μ¬μ©μ",
guest: "μλ",
};π λͺ¨λ key κ°μ β μ€μ κ°μ²΄, μμ λ§΅μ μ΅μ
π₯ Utility Type ν΅μ¬ μ 리
- νμ μ μλ‘ λ§λ€μ§ λ§κ³ μ‘°ν©νλΌ
- Partial / Pick / Omit / Required / Record
- μ΄ 5κ°λ©΄ μ€λ¬΄ νμ μ 90% ν΄κ²°
8οΈβ£ typeof β κ°μμ νμ μ λ½μλ΄λ μ€λ¬΄ ν΅μ¬ (1λΆ)
typeofλ λ°νμ κ°μΌλ‘λΆν° νμ
μ μ¬μ¬μ©νκ² ν΄μ€λ€.
1οΈβ£ μμ κ°μ²΄ β νμ μΌλ‘ λ§λ€κΈ° (μ΅λΉλ)
const ROLE_LABEL = {
admin: "κ΄λ¦¬μ",
user: "μΌλ° μ¬μ©μ",
guest: "μλ",
} as const;
type RoleLabelMap = typeof ROLE_LABEL;μλ―Έ:
- κ°κ³Ό νμ μ ν λ²λ§ μ μ
- νμ κ³Ό κ°μ΄ μ λ μ΄κΈλμ§ μμ
2οΈβ£ typeof + keyof β key νμ λ½κΈ° (μ€λ¬΄ μ‘°ν©)
type Role = keyof typeof ROLE_LABEL;
// "admin" | "user" | "guest"π enum λ체 ν¨ν΄ (κ°μ₯ λ§μ΄ μ)
3οΈβ£ ν¨μ λ°ν νμ μ¬μ¬μ©
function createUser() {
return {
id: 1,
name: "kim",
};
}
type User = ReturnType<typeof createUser>;π API μλ΅, ν©ν 리 ν¨μμμ λ§€μ° μ μ©
β typeofλ₯Ό μ μ°λ©΄ μκΈ°λ λ¬Έμ
const CONFIG = {
retry: 3,
timeout: 1000,
};
// νμ
μ λ°λ‘ λ μμ±
interface Config {
retry: number;
timeout: number;
}π κ°κ³Ό νμ μ΄ μ½κ² μ΄κΈλ¨
π₯ typeof μ€λ¬΄ ν΅μ¬ μμ½
- κ°μ΄ μ΄λ―Έ μμΌλ©΄ νμ μ λ€μ λ§λ€μ§ λ§ κ²
- typeofλ νμ μ€λ³΅μ μ κ±°νλ λꡬ
- Record / keyof μ ν¨κ» μ°λ©΄ μλ ₯μ΄ νλ°