íì ì€í¬ëŠœížì ê³ êž íì ìì ì± êž°ë²ì íìíë©° ê²¬ê³ íê³ ì ì§ë³Žì ê°ë¥í ì í늬ìŒìŽì ì ìì ìê² êµ¬ì¶íìžì.
íì ì€í¬ëŠœíž ì°ì£Œ íí: 믞ì 컚ížë¡€ íì ìì ì±
ì°ì£Œ ííê° ì¬ë¬ë¶, íìí©ëë€! ì€ë ì°ëЬì ì묎ë íì ì€í¬ëŠœížì ë§€í¹ì ìž ìžê³ì ê°ë ¥í íì ìì€í ì í구íë ê²ì ëë€. íì ì€í¬ëŠœížë¥Œ ê²¬ê³ íê³ ìì ì ìŽë©° ì ì§ë³Žì ê°ë¥í ì í늬ìŒìŽì 구ì¶ì ìí "믞ì 컚ížë¡€"ë¡ ìê°íììì€. ê³ êž íì ìì ì± êž°ë¥ì íì©í멎 ìíížìšìŽ ê°ë°ì ë³µì¡ì±ì ìì ìê² íìíê³ ì€ë¥ë¥Œ ìµìííë©° ìœë íì§ì ê·¹ëíí ì ììµëë€. ìŽ ì¬ì ì Ʞ볞 ê°ë ë¶í° ê³ êž êž°ë²ê¹ì§ êŽë²ìí 죌ì 륌 ë€ë£šë©°, íì ì€í¬ëŠœíž íì ìì ì± ë§ì€í°ê° ëêž° ìí ì§ì곌 êž°ì ì ê°ì¶ê² í ê²ì ëë€.
íì ìì ì±ìŽ ì€ìí ìŽì : ì°ì£Œì ì¶©ë ë°©ì§
ì¶ë°íêž° ì ì íì ìì ì±ìŽ ì ê·žë ê² ì€ìíì§ ìŽíŽíŽ ëŽ ìë€. JavaScriptì ê°ì ëì ìžìŽììë ì€ë¥ê° ë°íìììŒ ë°ê²¬ëë 겜ì°ê° ë§ì ììì¹ ëª»í ì¶©ë곌 ì¬ì©ì ë¶ë§ìŒë¡ ìŽìŽì§ëë€. ì ì íìŽíì ì¬ì©íë íì ì€í¬ëŠœížë ì¡°êž° ê²œê³ ìì€í ìí ì í©ëë€. ê°ë° ì€ì ì ì¬ì ìž íì êŽë š ì€ë¥ë¥Œ ìë³íì¬ íë¡ëì ì ëë¬íêž° ì ì 믞늬 ë°©ì§í©ëë€. ìŽë¬í ì¬ì ìë°©ì ì ê·Œ ë°©ìì ëë²ê¹ ìê°ì í¬ê² ì€ìŽê³ ì í늬ìŒìŽì ì ì ë°ì ìž ìì ì±ì í¥ììíµëë€.
íí íì ì ì²ëЬíë êžìµ ì í늬ìŒìŽì ì 구ì¶íë€ê³ ê°ì íŽ ëŽ ìë€. íì ìì ì±ìŽ ììŒë©Ž ê³ì° íšìì ì«ìê° ìë 묞ììŽì ì€ìë¡ ì ë¬íì¬ ë¶ì íí 결곌ì ì ì¬ì ìž ì¬ì ì ìì€ì ìŽëí ì ììµëë€. íì ì€í¬ëŠœížë ê°ë° ì€ì ìŽ ì€ë¥ë¥Œ ê°ì§íì¬ ê³ì°ìŽ íì ì¬ë°ë¥ž ë°ìŽí° ì íìŒë¡ ìíëëë¡ ë³Žì¥í ì ììµëë€.
íì ì€í¬ëŠœíž êž°ìŽ: Ʞ볞 íì ë° ìží°íìŽì€
ì°ëЬì ì¬ì ì íì
ì€í¬ëŠœížì Ʞ볞 êµ¬ì± ìììž êž°ë³ž íì
곌 ìží°íìŽì€ë¡ ììë©ëë€. íì
ì€í¬ëŠœížë number, string, boolean, null, undefined, symbolì í¬íší í¬êŽì ìž êž°ë³ž ì í ìžížë¥Œ ì ê³µí©ëë€. ìŽë¬í ì íì ë°ìŽí° 구조ì ëìì ì ìíë ê²¬ê³ í êž°ë°ì ì ê³µí©ëë€.
ë°ë©Žì ìží°íìŽì€ë ê°ì²Žì 몚ìì ì§ì íë ê³ìœì ì ìí ì ìëë¡ í©ëë€. ê°ì²Žê° ê°ì žìŒ íë ìì±ê³Œ ë©ìë륌 ì€ëª íì¬ ìœëë² ìŽì€ ì 첎ì ìŒêŽì±ê³Œ ììž¡ ê°ë¥ì±ì 볎ì¥í©ëë€.
ìì: ì§ì ìží°íìŽì€ ì ì
ê°ì íì¬ ì§ìì ëíëŽë ìží°íìŽì€ë¥Œ ë§ë€ìŽ ëŽ ìë€:
interface Employee {
id: number;
name: string;
title: string;
salary: number;
department: string;
address?: string; // ì íì ìì±
}
ìŽ ìží°íìŽì€ë id, name, title, salary, departmentì ê°ìŽ ì§ì ê°ì²Žê° ê°ì žìŒ íë ìì±ì ì ìí©ëë€. address ìì±ì ? êž°ížë¥Œ ì¬ì©íì¬ ì í ì¬íìŒë¡ íìëìŽ íìê° ìëì ëíë
ëë€.
ìŽì ìŽ ìží°íìŽì€ë¥Œ ì€ìíë ì§ì ê°ì²Žë¥Œ ë§ë€ìŽ ëŽ ìë€:
const employee: Employee = {
id: 123,
name: "Alice Johnson",
title: "Software Engineer",
salary: 80000,
department: "Engineering"
};
íì
ì€í¬ëŠœížë ìŽ ê°ì²Žê° Employee ìží°íìŽì€ë¥Œ ë°ë¥Žëë¡ ë³Žì¥íì¬ íì ìì±ì ì€ìë¡ ëëœíê±°ë ì못ë ë°ìŽí° ì íì í ë¹íë ê²ì ë°©ì§í©ëë€.
ì ë€ëŠ: ì¬ì¬ì© ê°ë¥íê³ íì ìì ì ìž êµ¬ì± ìì 구ì¶
ì ë€ëŠì íì ì€í¬ëŠœížì ê°ë ¥í êž°ë¥ìŒë¡, ë€ìí ë°ìŽí° ì í곌 íšê» ìëíë ì¬ì¬ì© ê°ë¥í êµ¬ì± ìì륌 ë§ë€ ì ììµëë€. ë°ë³µì ìž ìœëì ìë ì í ìºì€í ì íìì±ì íŒí멎ì ì ì°íê³ íì ìŽ ìì í ìœë륌 ìì±í ì ìê² íŽì€ëë€.
ìì: ì ë€ëŠ ëŠ¬ì€íž ìì±
몚ë ì íì ìì륌 볎ì í ì ìë ì ë€ëŠ ëŠ¬ì€ížë¥Œ ë§ë€ìŽ ëŽ ìë€:
class List<T> {
private items: T[] = [];
addItem(item: T): void {
this.items.push(item);
}
getItem(index: number): T | undefined {
return this.items[index];
}
getAllItems(): T[] {
return this.items;
}
}
// ì¬ì©ë²
const numberList = new List<number>();
numberList.addItem(1);
numberList.addItem(2);
const stringList = new List<string>();
stringList.addItem("Hello");
stringList.addItem("World");
console.log(numberList.getAllItems()); // ì¶ë ¥: [1, 2]
console.log(stringList.getAllItems()); // ì¶ë ¥: ["Hello", "World"]
ìŽ ìì ìì List íŽëì€ë ì ë€ëŠìŽë¯ë¡ 몚ë ì í Tì íšê» ì¬ì©í ì ììµëë€. List<number>륌 ë§ë€ë©Ž íì
ì€í¬ëŠœížë 늬ì€ížì ì«ìë§ ì¶ê°í ì ìëë¡ ë³Žì¥í©ëë€. ë§ì°¬ê°ì§ë¡ List<string>ì ë§ë€ë©Ž íì
ì€í¬ëŠœížë 늬ì€ížì 묞ììŽë§ ì¶ê°í ì ìëë¡ ë³Žì¥í©ëë€. ìŽë¥Œ íµíŽ ëŠ¬ì€ížì ì못ë ì íì ë°ìŽí°ë¥Œ ì€ìë¡ ì¶ê°í ìíì ì ê±°í ì ììµëë€.
ê³ êž íì : ì ë°í íì ìì ì± ê°ì
íì ì€í¬ëŠœížë íì ìì ì±ì ìžë°íê² ì¡°ì íê³ ë³µì¡í íì êŽê³ë¥Œ ííí ì ìë ë€ìí ê³ êž íì ì ì ê³µí©ëë€. ìŽë¬í íì ì ë€ì곌 ê°ìµëë€:
- ì ëìš íì : ì¬ë¬ ì í ì€ íëì ê°ì ëíë ëë€.
- ìží°ì¹ì íì : ì¬ë¬ íì ì ëšìŒ íì ìŒë¡ ê²°í©í©ëë€.
- ì¡°ê±Žë¶ íì : ë€ë¥ž íì ì ë°ëŒ ë¬ëŒì§ë íì ì ì ìí ì ììµëë€.
- ë§€íë íì : Ʞ졎 íì ì ì íì ìŒë¡ ë³íí©ëë€.
- íì ê°ë: í¹ì ë²ì ëŽìì ë³ìì íì ì ì¢í ì ììµëë€.
ìì: ì ëìš íì ì ì¬ì©í ì ì°í ì ë ¥
묞ììŽ ëë ì«ì륌 ì ë ¥ìŒë¡ ë°ìë€ìŽë íšìê° ìë€ê³ ê°ì íŽ ëŽ ìë€:
function printValue(value: string | number): void {
console.log(value);
}
printValue("Hello"); // ì íš
printValue(123); // ì íš
// printValue(true); // ì íšíì§ ìì (booleanì íì©ëì§ ìì)
ì ëìš íì
string | number륌 ì¬ì©í멎 value ë§€ê°ë³ìê° ë¬žììŽ ëë ì«ìê° ë ì ììì ì§ì í ì ììµëë€. íì
ì€í¬ëŠœížë ìŽ íì
ì ìœ ì¡°ê±Žì ê°ì íì¬ íšìì boolean ëë êž°í ì íšíì§ ìì ì íì ì€ìë¡ ì ë¬íë ê²ì ë°©ì§í©ëë€.
ìì: ì¡°ê±Žë¶ íì ì ì¬ì©í íì ë³í
ì¡°ê±Žë¶ íì ì ì¬ì©í멎 ë€ë¥ž íì ì ë°ëŒ ë¬ëŒì§ë íì ì ë§ë€ ì ììµëë€. ìŽë ê°ì²Žì ìì±ì êž°ë°ìŒë¡ ëì ìŒë¡ ìì±ëë íì ì ì ìíë ë° í¹í ì ì©í©ëë€.
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
function myFunction(x: number): string {
return x.toString();
}
type MyFunctionReturnType = ReturnType<typeof myFunction>; // string
ì¬êž°ì `ReturnType` ì¡°ê±Žë¶ íì ì `T`ê° íšììžì§ íìží©ëë€. íšììŽë©Ž íšìì ë°í íì `R`ì ì¶ë¡ í©ëë€. ê·žë ì§ ììŒë©Ž Ʞ볞ê°ì `any`ê° ë©ëë€. ìŽë¥Œ íµíŽ ì»ŽíìŒ ìê°ì íšìì ë°í íì ì ëì ìŒë¡ ê²°ì í ì ììµëë€.
ë§€íë íì : íì ë³í ìëí
ë§€íë íì ì íì ì ê° ìì±ì ë³íì ì ì©íì¬ êž°ì¡Ž íì ì ë³ííë ê°ê²°í ë°©ë²ì ì ê³µí©ëë€. ìŽë 몚ë ìì±ì ì í ì¬íìŒë¡ ë§ë€ê±°ë ìœêž° ì ì©ìŒë¡ ë§ëë ë± ê°ì²Ž ìì±ì ìì íë ì ížëŠ¬í° íì ì ë§ëë ë° í¹í ì ì©í©ëë€.
ìì: ìœêž° ì ì© íì ìì±
ê°ì²Žì 몚ë ìì±ì ìœêž° ì ì©ìŒë¡ ë§ëë ë§€íë íì ì ë§ë€ìŽ ëŽ ìë€:
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
interface Person {
name: string;
age: number;
}
const person: Readonly<Person> = {
name: "John Doe",
age: 30
};
// person.age = 31; // ì€ë¥: 'age'ë ìœêž° ì ì© ìì±ìŽë¯ë¡ í ë¹í ì ììµëë€.
Readonly<T> ë§€íë íì
ì íì
`T`ì 몚ë ìì± `K`륌 ë°ë³µíê³ ìœêž° ì ì©ìŒë¡ ë§ëëë€. ìŽë¥Œ íµíŽ ê°ì²Žê° ìì±ë í ìì±ì ì€ìë¡ ìì íë ê²ì ë°©ì§í ì ììµëë€.
ì ížëŠ¬í° íì : ëŽì¥ íì ë³í íì©
íì ì€í¬ëŠœížë ìŠì ì¬ì©í ì ìë ìŒë°ì ìž íì ë³íì ì ê³µíë ë€ìí ëŽì¥ ì ížëŠ¬í° íì ì ì ê³µí©ëë€. ìŽë¬í ì ížëŠ¬í° íì ì ë€ì곌 ê°ìµëë€:
Partial<T>:Tì 몚ë ìì±ì ì í ì¬íìŒë¡ ë§ëëë€.Required<T>:Tì 몚ë ìì±ì íìë¡ ë§ëëë€.Readonly<T>:Tì 몚ë ìì±ì ìœêž° ì ì©ìŒë¡ ë§ëëë€.Pick<T, K>:Tìì ìì± ì§í©K륌 ì ííì¬ ì íì ì ë§ëëë€.Omit<T, K>:Tìì ìì± ì§í©K륌 ì ìžíì¬ ì íì ì ë§ëëë€.Record<K, T>: í€Kì ê°T륌 ê°ì§ íì ì ë§ëëë€.
ìì: Partialì ì¬ì©íì¬ ì íì ìì± ë§ë€êž°
Partial<T> ì ížëŠ¬í° íì
ì ì¬ì©íì¬ Employee ìží°íìŽì€ì 몚ë ìì±ì ì í ì¬íìŒë¡ ë§ë€ìŽ ëŽ
ìë€:
type PartialEmployee = Partial<Employee>;
const partialEmployee: PartialEmployee = {
name: "Jane Smith"
};
ìŽì name ìì±ë§ ì§ì ë ì§ì ê°ì²Žë¥Œ ë§ë€ ì ììµëë€. Partial<T> ì ížëŠ¬í° íì
ëë¶ì ë€ë¥ž ìì±ì ì í ì¬íì
ëë€.
ë¶ë³ì±: ê²¬ê³ íê³ ììž¡ ê°ë¥í ì í늬ìŒìŽì 구ì¶
ë¶ë³ì±ì ìì± í ìì í ì ìë ë°ìŽí° 구조 ìì±ì ì€ì ì ë íë¡ê·žëë° íšë¬ë€ìì ëë€. ìŽ ì ê·Œ ë°©ìì ììž¡ ê°ë¥ì± ìŠê°, ì€ë¥ ìí ê°ì, ì±ë¥ í¥ì곌 ê°ì ëª ê°ì§ ìŽì ì ì ê³µí©ëë€.
íì ì€í¬ëŠœížë¡ ë¶ë³ì± ì ì©
íì ì€í¬ëŠœížë ìœëìì ë¶ë³ì±ì ì ì©íë ë° ëììŽ ëë ëª ê°ì§ êž°ë¥ì ì ê³µí©ëë€:
- ìœêž° ì ì© ìì±:
readonlyí€ìë륌 ì¬ì©íì¬ ìŽêž°í í ìì±ì ìì í ì ìëë¡ í©ëë€. - ê°ì²Ž ëê²°:
Object.freeze()ë©ìë륌 ì¬ì©íì¬ ê°ì²Ž ìì ì ë°©ì§í©ëë€. - ë¶ë³ ë°ìŽí° 구조: Immutable.js ëë Moriì ê°ì ëŒìŽëžë¬ëЬì ë¶ë³ ë°ìŽí° 구조륌 ì¬ì©í©ëë€.
ìì: ìœêž° ì ì© ìì± ì¬ì©
id ìì±ì ìœêž° ì ì©ìŒë¡ ë§ë€êž° ìíŽ Employee ìží°íìŽì€ë¥Œ ìì íŽ ëŽ
ìë€:
interface Employee {
readonly id: number;
name: string;
title: string;
salary: number;
department: string;
}
const employee: Employee = {
id: 123,
name: "Alice Johnson",
title: "Software Engineer",
salary: 80000,
department: "Engineering"
};
// employee.id = 456; // ì€ë¥: 'id'ë ìœêž° ì ì© ìì±ìŽë¯ë¡ í ë¹í ì ììµëë€.
ìŽì employee ê°ì²Žì id ìì±ì ìì±í í ìì í ì ììµëë€.
íšìí íë¡ê·žëë°: íì ìì ì±ê³Œ ììž¡ ê°ë¥ì± ìì©
íšìí íë¡ê·žëë°ì ìì íšì, ë¶ë³ì± ë° ì ìží íë¡ê·žëë° ì¬ì©ì ê°ì¡°íë íë¡ê·žëë° íšë¬ë€ìì ëë€. ìŽ ì ê·Œ ë°©ìì ì ì§ë³Žì ê°ë¥íê³ í ì€íž ê°ë¥íë©° ìì ì ìž ìœëë¡ ìŽìŽì§ ì ììµëë€.
íšìí íë¡ê·žëë°ì ìí íì ì€í¬ëŠœíž íì©
íì ì€í¬ëŠœížì íì ìì€í ì ê°ë ¥í íì ê²ì¬ë¥Œ ì ê³µíê³ ëª íí ì ë ¥ ë° ì¶ë ¥ íì ì ê°ì§ ìì íšì륌 ì ìí ì ìëë¡ íì¬ íšìí íë¡ê·žëë° ìì¹ì 볎ìí©ëë€.
ìì: ìì íšì ìì±
ì«ì ë°°ìŽì í©ê³ë¥Œ ê³ì°íë ìì íšì륌 ë§ë€ìŽ ëŽ ìë€:
function sum(numbers: number[]): number {
let total = 0;
for (const number of numbers) {
total += number;
}
return total;
}
const numbers = [1, 2, 3, 4, 5];
const total = sum(numbers);
console.log(total); // ì¶ë ¥: 15
ìŽ íšìë ëìŒí ì ë ¥ì ëíŽ íì ëìŒí ì¶ë ¥ì ë°ííê³ ë¶ìì©ìŽ ìêž° ë묞ì ììí©ëë€. ë°ëŒì í ì€ížíê³ ìŽíŽíêž° ìœìµëë€.
ì€ë¥ ì²ëЬ: ë³µìë ¥ ìë ì í늬ìŒìŽì 구ì¶
ì€ë¥ ì²ëЬë ìíížìšìŽ ê°ë°ì ì€ìí 잡멎ì ëë€. íì ì€í¬ëŠœížë ì€ë¥ ì²ëЬ ìë늬ì€ì ëí 컎íìŒ ìê° íì ê²ì¬ë¥Œ ì ê³µíì¬ ë ë³µìë ¥ ìë ì í늬ìŒìŽì ì 구ì¶íë ë° ëììŽ ë ì ììµëë€.
ìì: ì°šë³íë ì ëìšì ì¬ì©í ì€ë¥ ì²ëЬ
API ížì¶ 결곌륌 ëíëŽêž° ìíŽ ì°šë³íë ì ëìšì ì¬ì©íì¬ ì±ê³µ ëë ì€ë¥ê° ë ì ìëë¡ íŽ ëŽ ìë€:
interface Success<T> {
success: true;
data: T;
}
interface Error {
success: false;
error: string;
}
type Result<T> = Success<T> | Error;
async function fetchData(): Promise<Result<string>> {
try {
// API ížì¶ ì뮬ë ìŽì
const data = await Promise.resolve("Data from API");
return { success: true, data };
} catch (error: any) {
return { success: false, error: error.message };
}
}
async function processData() {
const result = await fetchData();
if (result.success) {
console.log("Data:", result.data);
} else {
console.error("Error:", result.error);
}
}
processData();
ìŽ ìì ìì Result<T> íì
ì Success<T> ëë Errorê° ë ì ìë ì°šë³íë ì ëìšì
ëë€. success ìì±ì íë³ì ìí ì íì¬ API ížì¶ìŽ ì±ê³µíëì§ ì¬ë¶ë¥Œ ìœê² ê²°ì í ì ììµëë€. íì
ì€í¬ëŠœížë ìŽ íì
ì ìœ ì¡°ê±Žì ê°ì íì¬ ì±ê³µ ë° ì€ë¥ ìë늬ì€ë¥Œ ì ì íê² ì²ëЬíëë¡ ë³Žì¥í©ëë€.
ì묎 ìë£: íì ì€í¬ëŠœíž íì ìì ì± ë§ì€í°
ì°ì£Œ ííê° ì¬ë¬ë¶, ì¶íë늜ëë€! íì ì€í¬ëŠœíž íì ìì ì±ì ìžê³ë¥Œ ì±ê³µì ìŒë¡ íìíê³ ê°ë ¥í êž°ë¥ì ëí ê¹ì ìŽíŽë¥Œ ì»ììµëë€. ìŽ ê°ìŽëìì ë Œìë êž°ë²ê³Œ ìì¹ì ì ì©í멎 ë ê²¬ê³ íê³ ìì ì ìŽë©° ì ì§ë³Žì ê°ë¥í ì í늬ìŒìŽì ì 구ì¶í ì ììµëë€. êž°ì ì ëì± í¥ììí€ê³ ì§ì í íì ìì ì± ë§ì€í°ê° ëêž° ìíŽ íì ì€í¬ëŠœížì íì ìì€í ì ê³ì íìíê³ ì€ííë ê²ì ìì§ ë§ììì€.
ì¶ê° í구: 늬ìì€ ë° ëªšë² ì¬ë¡
íì ì€í¬ëŠœíž ì¬ì ì ê³ìíë €ë©Ž ë€ì 늬ìì€ë¥Œ ìŽíŽë³Žìžì:
- íì ì€í¬ëŠœíž ë¬žì: ê³µì íì ì€í¬ëŠœíž ë¬žìë ìžìŽì 몚ë 잡멎ì ë°°ì°ë ë° ê·ì€í ìë£ì ëë€.
- íì ì€í¬ëŠœíž ë¥ ë€ìŽëž: íì ì€í¬ëŠœížì ê³ êž êž°ë¥ì ëí í¬êŽì ìž ê°ìŽëì ëë€.
- íì ì€í¬ëŠœíž ížëë¶: íì ì€í¬ëŠœížì 구묞, ìë¯žë¡ ë° íì ìì€í ì ëí ììží ê°ìì ëë€.
- ì€í ìì€ íì ì€í¬ëŠœíž íë¡ì íž: GitHubìì ì€í ìì€ íì ì€í¬ëŠœíž íë¡ì ížë¥Œ íìíì¬ ìë šë ê°ë°ìë¡ë¶í° ë°°ì°ê³ ì€ì ìë늬ì€ìì íì ì€í¬ëŠœížê° ìŽë»ê² ì ì©ëëì§ ìì볎ìžì.
íì ìì ì±ì ìì©íê³ ì§ìì ìŒë¡ íìµíšìŒë¡ìš íì ì€í¬ëŠœížì ì ì¬ë ¥ì ìµëí íì©íê³ ìê°ìŽ ì§ëë ë³ì¹ ìë ë°ìŽë ìíížìšìŽë¥Œ 구ì¶í ì ììµëë€. ìŠê±°ìŽ ìœë© ëìžì!