TypeScript μ λ€λ¦μ λν ν¬κ΄μ μΈ κ°μ΄λ. ꡬ문, μ΄μ , κ³ κΈ μ¬μ©λ² λ° κΈλ‘λ² μννΈμ¨μ΄ κ°λ°μμ 볡μ‘ν λ°μ΄ν° νμ μ μ²λ¦¬νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
TypeScript μ λ€λ¦: κ°λ ₯ν μ ν리μΌμ΄μ μ μν 볡μ‘ν λ°μ΄ν° νμ λ§μ€ν°νκΈ°
JavaScriptμ μμ μ§ν©μΈ TypeScriptλ κ°λ°μκ° μ μ νμ΄νμ ν΅ν΄ λ κ°λ ₯νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μλλ‘ μ§μν©λλ€. κ°μ₯ κ°λ ₯ν κΈ°λ₯ μ€ νλλ μ λ€λ¦(generics)μΌλ‘, νμ μμ μ±μ μ μ§νλ©΄μ λ€μν λ°μ΄ν° νμ κ³Ό ν¨κ» μλνλ μ½λλ₯Ό μμ±ν μ μκ² ν΄μ€λλ€. μ΄ κ°μ΄λλ κΈλ‘λ² μννΈμ¨μ΄ κ°λ° νκ²½μμ 볡μ‘ν λ°μ΄ν° νμ μ λν μ λ€λ¦μ μ μ©μ μ΄μ μ λ§μΆ° TypeScript μ λ€λ¦μ λν ν¬κ΄μ μΈ νꡬλ₯Ό μ 곡ν©λλ€.
μ λ€λ¦μ΄λ 무μμΈκ°?
μ λ€λ¦μ λ€μν νμ κ³Ό ν¨κ» μλν μ μλ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±νλ λ°©λ²μ μ 곡ν©λλ€. μ§μνλ €λ κ° νμ μ λν΄ λ³λμ ν¨μλ ν΄λμ€λ₯Ό μμ±νλ λμ , νμ λ§€κ°λ³μλ₯Ό μ¬μ©νλ λ¨μΌ ν¨μλ ν΄λμ€λ₯Ό μμ±ν μ μμ΅λλ€. μ΄λ¬ν νμ λ§€κ°λ³μλ ν¨μλ ν΄λμ€κ° νΈμΆλκ±°λ μΈμ€ν΄μ€νλ λ μ¬μ©λ μ€μ νμ μ μν νλ μ΄μ€νλμ λλ€. μ΄λ νΉν ν΄λΉ ꡬ쑰 λ΄μ λ°μ΄ν° νμ μ΄ λ¬λΌμ§ μ μλ 볡μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό λ€λ£° λ μ μ©ν©λλ€.
μ λ€λ¦ μ¬μ©μ μ΄μ
- μ½λ μ¬μ¬μ©μ±: μ½λλ₯Ό ν λ² μμ±νκ³ λ€λ₯Έ νμ λ€κ³Ό ν¨κ» μ¬μ©ν©λλ€. μ΄λ μ½λ μ€λ³΅μ μ€μ΄κ³ μ½λλ² μ΄μ€μ μ μ§λ³΄μμ±μ λμ λλ€.
- νμ μμ μ±: μ λ€λ¦μ TypeScript μ»΄νμΌλ¬κ° μ»΄νμΌ μκ°μ νμ μμ μ±μ κ°μ νλλ‘ ν©λλ€. μ΄λ νμ λΆμΌμΉμ κ΄λ ¨λ λ°νμ μ€λ₯λ₯Ό λ°©μ§νλ λ° λμμ΄ λ©λλ€.
- κ°λ μ± ν₯μ: μ λ€λ¦μ ν¨μμ ν΄λμ€κ° μ΄λ€ νμ κ³Ό ν¨κ» μλνλλ‘ μ€κ³λμλμ§ λͺ ννκ² νμνμ¬ μ½λμ κ°λ μ±μ λμ λλ€.
- μ±λ₯ ν₯μ: κ²½μ°μ λ°λΌ, μ»΄νμΌλ¬κ° μ¬μ©λλ νΉμ νμ μ κΈ°λ°μΌλ‘ μμ±λ μ½λλ₯Ό μ΅μ νν μ μκΈ° λλ¬Έμ μ λ€λ¦μ μ±λ₯ ν₯μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μ λ€λ¦μ κΈ°λ³Έ ꡬ문
μ λ€λ¦μ κΈ°λ³Έ ꡬ문μ κΊΎμ κ΄νΈ(< >)λ₯Ό μ¬μ©νμ¬ νμ
λ§€κ°λ³μλ₯Ό μ μΈνλ κ²μ ν¬ν¨ν©λλ€. μ΄λ¬ν νμ
λ§€κ°λ³μλ μΌλ°μ μΌλ‘ T, K, V λ±μΌλ‘ λͺ
λͺ
λμ§λ§, μ ν¨ν μλ³μλΌλ©΄ 무μμ΄λ μ¬μ©ν μ μμ΅λλ€. λ€μμ μ λ€λ¦ ν¨μμ κ°λ¨ν μμ
λλ€:
function identity<T>(arg: T): T {
return arg;
}
let myString: string = identity<string>("hello");
let myNumber: number = identity<number>(123);
let myBoolean: boolean = identity<boolean>(true);
console.log(myString); // Output: hello
console.log(myNumber); // Output: 123
console.log(myBoolean); // Output: true
μ΄ μμμ <T>λ TλΌλ νμ
λ§€κ°λ³μλ₯Ό μ μΈν©λλ€. identity ν¨μλ T νμ
μ μΈμλ₯Ό λ°μ T νμ
μ κ°μ λ°νν©λλ€. ν¨μλ₯Ό νΈμΆν λ, νμ
λ§€κ°λ³μλ₯Ό λͺ
μμ μΌλ‘ μ§μ νκ±°λ(μ: identity<string>) TypeScriptκ° μΈμ νμ
μ κΈ°λ°μΌλ‘ μΆλ‘ νλλ‘ ν μ μμ΅λλ€.
볡μ‘ν λ°μ΄ν° νμ λ€λ£¨κΈ°
μ λ€λ¦μ λ°°μ΄, κ°μ²΄, μΈν°νμ΄μ€μ κ°μ 볡μ‘ν λ°μ΄ν° νμ μ λ€λ£° λ νΉν μ μ©ν©λλ€. λͺ κ°μ§ μΌλ°μ μΈ μλ리μ€λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
μ λ€λ¦ λ°°μ΄
μ λ€λ¦μ μ¬μ©νμ¬ λ€μν νμ μ λ°°μ΄κ³Ό ν¨κ» μλνλ ν¨μλ ν΄λμ€λ₯Ό λ§λ€ μ μμ΅λλ€:
function arrayToString<T>(arr: T[]): string {
return arr.join(", ");
}
let numberArray: number[] = [1, 2, 3, 4, 5];
let stringArray: string[] = ["apple", "banana", "cherry"];
console.log(arrayToString(numberArray)); // Output: 1, 2, 3, 4, 5
console.log(arrayToString(stringArray)); // Output: apple, banana, cherry
μ¬κΈ°μ arrayToString ν¨μλ T[] νμ
μ λ°°μ΄μ λ°μ λ°°μ΄μ λ¬Έμμ΄ ννμ λ°νν©λλ€. μ΄ ν¨μλ λͺ¨λ νμ
μ λ°°μ΄κ³Ό ν¨κ» μλνλ―λ‘ μ¬μ¬μ©μ±μ΄ λ§€μ° λμ΅λλ€.
μ λ€λ¦ κ°μ²΄
μ λ€λ¦μ λν λ€μν ννμ κ°μ²΄μ ν¨κ» μλνλ ν¨μλ ν΄λμ€λ₯Ό μ μνλ λ° μ¬μ©λ μ μμ΅λλ€:
interface Person {
name: string;
age: number;
country: string; // κΈλ‘λ² μ»¨ν
μ€νΈλ₯Ό μν΄ κ΅κ° μΆκ°
}
interface Product {
id: number;
name: string;
price: number;
currency: string; // κΈλ‘λ² μ»¨ν
μ€νΈλ₯Ό μν΄ ν΅ν μΆκ°
}
function displayInfo<T extends { name: string }>(item: T): void {
console.log(`Name: ${item.name}`);
}
let person: Person = { name: "Alice", age: 30, country: "USA" };
let product: Product = { id: 1, name: "Laptop", price: 1200, currency: "USD" };
displayInfo(person); // Output: Name: Alice
displayInfo(product); // Output: Name: Laptop
μ΄ μμμ displayInfo ν¨μλ λ¬Έμμ΄ νμ
μ name μμ±μ κ°μ ΈμΌ νλ T νμ
μ κ°μ²΄λ₯Ό λ°μ΅λλ€. extends { name: string } μ μ μ μ½ μ‘°κ±΄(constraint)μΌλ‘, νμ
λ§€κ°λ³μ Tμ λν μ΅μ μꡬμ¬νμ λͺ
μν©λλ€. μ΄λ₯Ό ν΅ν΄ ν¨μκ° name μμ±μ μμ νκ² μ κ·Όν μ μμ΅λλ€.
κ³ κΈ μ λ€λ¦ μ¬μ©λ²
TypeScript μ λ€λ¦μ ν¨μ¬ λ μ μ°νκ³ κ°λ ₯ν μ½λλ₯Ό λ§λ€ μ μλ κ³ κΈ κΈ°λ₯μ μ 곡ν©λλ€. μ΄λ¬ν κΈ°λ₯ μ€ μΌλΆλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
λ€μ€ νμ λ§€κ°λ³μ
μ¬λ¬ νμ λ§€κ°λ³μλ₯Ό κ°μ§ ν¨μλ ν΄λμ€λ₯Ό μ μν μ μμ΅λλ€:
function merge<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
interface Name {
firstName: string;
}
interface Age {
age: number;
}
const person: Name = { firstName: "Bob" };
const details: Age = { age: 42 };
const merged = merge(person, details);
console.log(merged.firstName); // Output: Bob
console.log(merged.age); // Output: 42
merge ν¨μλ Tμ U νμ
μ λ κ°μ²΄λ₯Ό λ°μ λ κ°μ²΄μ μμ±μ λͺ¨λ ν¬ν¨νλ μλ‘μ΄ κ°μ²΄λ₯Ό λ°νν©λλ€. μ΄λ λ€λ₯Έ μμ€μ λ°μ΄ν°λ₯Ό κ²°ν©νλ κ°λ ₯ν λ°©λ²μ
λλ€.
μ λ€λ¦ μ μ½ μ‘°κ±΄
μμ λ³Έ λ°μ κ°μ΄, μ μ½ μ‘°κ±΄μ μ¬μ©νλ©΄ μ λ€λ¦ νμ λ§€κ°λ³μμ ν¨κ» μ¬μ©ν μ μλ νμ μ μ νν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ λ€λ¦ μ½λκ° μ§μ λ νμ μ λν΄ μμ νκ² μλν μ μλλ‘ λ³΄μ₯ν©λλ€.
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
loggingIdentity([1, 2, 3]); // Output: 3
loggingIdentity("hello"); // Output: 5
// loggingIdentity(123); // μ€λ₯: 'number' νμ
μ μΈμλ 'Lengthwise' νμ
μ λ§€κ°λ³μμ ν λΉν μ μμ΅λλ€.
loggingIdentity ν¨μλ μ«μ νμ
μ length μμ±μ κ°μ ΈμΌ νλ T νμ
μ μΈμλ₯Ό λ°μ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν¨μκ° length μμ±μ μμ νκ² μ κ·Όν μ μμ΅λλ€.
μ λ€λ¦ ν΄λμ€
μ λ€λ¦μ ν΄λμ€μ ν¨κ» μ¬μ©ν μλ μμ΅λλ€:
class DataStorage<T> {
private data: T[] = [];
addItem(item: T) {
this.data.push(item);
}
removeItem(item: T) {
this.data = this.data.filter(d => d !== item);
}
getItems(): T[] {
return [...this.data];
}
}
const textStorage = new DataStorage<string>();
textStorage.addItem("apple");
textStorage.addItem("banana");
textStorage.removeItem("apple");
console.log(textStorage.getItems()); // Output: [ 'banana' ]
const numberStorage = new DataStorage<number>();
numberStorage.addItem(1);
numberStorage.addItem(2);
numberStorage.removeItem(1);
console.log(numberStorage.getItems()); // Output: [ 2 ]
DataStorage ν΄λμ€λ λͺ¨λ T νμ
μ λ°μ΄ν°λ₯Ό μ μ₯ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νμ
μμ μ±μ κ°μΆ μ¬μ¬μ© κ°λ₯ν λ°μ΄ν° ꡬ쑰λ₯Ό λ§λ€ μ μμ΅λλ€.
μ λ€λ¦ μΈν°νμ΄μ€
μ λ€λ¦ μΈν°νμ΄μ€λ λ€μν νμ κ³Ό ν¨κ» μλν μ μλ κ³μ½μ μ μνλ λ° μ μ©ν©λλ€. μλ₯Ό λ€μ΄:
interface Result<T, E> {
success: boolean;
data?: T;
error?: E;
}
interface User {
id: number;
username: string;
email: string;
}
interface ErrorMessage {
code: number;
message: string;
}
function fetchUser(id: number): Result<User, ErrorMessage> {
if (id === 1) {
return { success: true, data: { id: 1, username: "john.doe", email: "john.doe@example.com" } };
} else {
return { success: false, error: { code: 404, message: "User not found" } };
}
}
const userResult = fetchUser(1);
if (userResult.success) {
console.log(userResult.data.username);
} else {
console.log(userResult.error.message);
}
Result μΈν°νμ΄μ€λ μμ
μ κ²°κ³Όλ₯Ό λνλ΄λ μ λ€λ¦ ꡬ쑰λ₯Ό μ μν©λλ€. μ΄λ T νμ
μ λ°μ΄ν°λ₯Ό ν¬ν¨νκ±°λ E νμ
μ μ€λ₯λ₯Ό ν¬ν¨ν μ μμ΅λλ€. μ΄λ λΉλκΈ° μμ
μ΄λ μ€ν¨ν μ μλ μμ
μ μ²λ¦¬νκΈ° μν μΌλ°μ μΈ ν¨ν΄μ
λλ€.
μ νΈλ¦¬ν° νμ κ³Ό μ λ€λ¦
TypeScriptλ μ λ€λ¦κ³Ό μ μλνλ μ¬λ¬ λ΄μ₯ μ νΈλ¦¬ν° νμ μ μ 곡ν©λλ€. μ΄λ¬ν μ νΈλ¦¬ν° νμ μ νμ μ κ°λ ₯ν λ°©μμΌλ‘ λ³ννκ³ μ‘°μνλ λ° λμμ΄ λ μ μμ΅λλ€.
Partial<T>
Partial<T>λ T νμ
μ λͺ¨λ μμ±μ μ νμ μΌλ‘ λ§λλλ€:
interface Person {
name: string;
age: number;
}
type PartialPerson = Partial<Person>;
const partialPerson: PartialPerson = { name: "Alice" }; // μ ν¨ν¨
Readonly<T>
Readonly<T>λ T νμ
μ λͺ¨λ μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλλ€:
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = Readonly<Person>;
const readonlyPerson: ReadonlyPerson = { name: "Bob", age: 42 };
// readonlyPerson.age = 43; // μ€λ₯: 'age'λ μ½κΈ° μ μ© μμ±μ΄λ―λ‘ ν λΉν μ μμ΅λλ€.
Pick<T, K>
Pick<T, K>λ T νμ
μμ μμ± μ§ν© Kλ₯Ό μ νν©λλ€:
interface Person {
name: string;
age: number;
email: string;
}
type NameAndAge = Pick<Person, "name" | "age">;
const nameAndAge: NameAndAge = { name: "Charlie", age: 28 };
Omit<T, K>
Omit<T, K>λ T νμ
μμ μμ± μ§ν© Kλ₯Ό μ κ±°ν©λλ€:
interface Person {
name: string;
age: number;
email: string;
}
type PersonWithoutEmail = Omit<Person, "email">;
const personWithoutEmail: PersonWithoutEmail = { name: "David", age: 35 };
Record<K, T>
Record<K, T>λ ν€κ° Kμ΄κ³ κ°μ΄ T νμ
μΈ νμ
μ μμ±ν©λλ€:
type CountryCodes = "US" | "CA" | "UK" | "DE" | "FR" | "JP" | "CN" | "IN" | "BR" | "AU"; // κΈλ‘λ² μ»¨ν
μ€νΈλ₯Ό μν΄ λͺ©λ‘ νμ₯
type Currency = "USD" | "CAD" | "GBP" | "EUR" | "JPY" | "CNY" | "INR" | "BRL" | "AUD"; // κΈλ‘λ² μ»¨ν
μ€νΈλ₯Ό μν΄ λͺ©λ‘ νμ₯
type CurrencyMap = Record<CountryCodes, Currency>;
const currencyMap: CurrencyMap = {
"US": "USD",
"CA": "CAD",
"UK": "GBP",
"DE": "EUR",
"FR": "EUR",
"JP": "JPY",
"CN": "CNY",
"IN": "INR",
"BR": "BRL",
"AU": "AUD",
};
λ§΅λ νμ (Mapped Types)
λ§΅λ νμ μ μ¬μ©νλ©΄ κΈ°μ‘΄ νμ μ μμ±μ λ°λ³΅νμ¬ λ³νν μ μμ΅λλ€. μ΄λ κΈ°μ‘΄ νμ μ κΈ°λ°μΌλ‘ μλ‘μ΄ νμ μ λ§λλ κ°λ ₯ν λ°©λ²μ λλ€. μλ₯Ό λ€μ΄, λ€λ₯Έ νμ μ λͺ¨λ μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλ νμ μ λ§λ€ μ μμ΅λλ€:
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = {
readonly [K in keyof Person]: Person[K];
};
const readonlyPerson: ReadonlyPerson = { name: "Eve", age: 25 };
// readonlyPerson.age = 26; // μ€λ₯: 'age'λ μ½κΈ° μ μ© μμ±μ΄λ―λ‘ ν λΉν μ μμ΅λλ€.
μ΄ μμμ [K in keyof Person]μ Person μΈν°νμ΄μ€μ λͺ¨λ ν€λ₯Ό λ°λ³΅νκ³ , Person[K]λ κ° μμ±μ νμ
μ μ κ·Όν©λλ€. readonly ν€μλλ κ° μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλλ€.
μ‘°κ±΄λΆ νμ (Conditional Types)
μ‘°κ±΄λΆ νμ μ μ¬μ©νλ©΄ 쑰건μ λ°λΌ νμ μ μ μν μ μμ΅λλ€. μ΄λ λ€μν μλ리μ€μ μ μνλ νμ μ λ§λλ κ°λ ₯ν λ°©λ²μ λλ€.
type NonNullable<T> = T extends null | undefined ? never : T;
type MaybeString = string | null | undefined;
type StringType = NonNullable<MaybeString>; // string
function getValue<T>(value: T): NonNullable<T> {
if (value == null) { // nullκ³Ό undefined λͺ¨λ μ²λ¦¬
throw new Error("κ°μ null λλ undefinedμΌ μ μμ΅λλ€");
}
return value as NonNullable<T>;
}
try {
const validValue = getValue("hello");
console.log(validValue.toUpperCase()); // Output: HELLO
const invalidValue = getValue(null); // μ΄ μ½λλ μ€λ₯λ₯Ό λ°μμν΅λλ€
console.log(invalidValue); // μ΄ μ€μ μ€νλμ§ μμ΅λλ€
} catch (error: any) {
console.error(error.message); // Output: κ°μ null λλ undefinedμΌ μ μμ΅λλ€
}
μ΄ μμμ NonNullable<T> νμ
μ Tκ° null λλ undefinedμΈμ§ νμΈν©λλ€. λ§μ½ κ·Έλ λ€λ©΄, νμ©λμ§ μλ νμ
μμ μλ―Ένλ neverλ₯Ό λ°νν©λλ€. κ·Έλ μ§ μμΌλ©΄ Tλ₯Ό λ°νν©λλ€. μ΄λ₯Ό ν΅ν΄ nullμ΄ μλμ 보μ₯νλ νμ
μ λ§λ€ μ μμ΅λλ€.
μ λ€λ¦ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
μ λ€λ¦μ μ¬μ©ν λ μΌλμ λμ΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μ€λͺ μ μΈ νμ λ§€κ°λ³μ μ΄λ¦ μ¬μ©: νμ λ§€κ°λ³μμ λͺ©μ μ λͺ ννκ² λνλ΄λ μ΄λ¦μ μ ννμΈμ.
- μ λ€λ¦ νμ λ§€κ°λ³μμ ν¨κ» μ¬μ©ν μ μλ νμ μ μ ννκΈ° μν΄ μ μ½ μ‘°κ±΄ μ¬μ©: μ΄λ₯Ό ν΅ν΄ μ λ€λ¦ μ½λκ° μ§μ λ νμ μ λν΄ μμ νκ² μλνλλ‘ λ³΄μ₯ν©λλ€.
- μ λ€λ¦ μ½λλ₯Ό λ¨μνκ³ μ§μ€μ μΌλ‘ μ μ§: λ무 λ§μ νμ λ§€κ°λ³μλ 볡μ‘ν μ μ½ μ‘°κ±΄μΌλ‘ μ λ€λ¦ μ½λλ₯Ό μ§λμΉκ² 볡μ‘νκ² λ§λ€μ§ λ§μΈμ.
- μ λ€λ¦ μ½λλ₯Ό μ² μ ν λ¬Έμν: νμ λ§€κ°λ³μμ λͺ©μ κ³Ό μ¬μ©λ λͺ¨λ μ μ½ μ‘°κ±΄μ μ€λͺ νμΈμ.
- μ½λ μ¬μ¬μ©μ±κ³Ό νμ μμ μ± κ°μ μ μΆ©μ κ³ λ €: μ λ€λ¦μ μ½λ μ¬μ¬μ©μ±μ ν₯μμν¬ μ μμ§λ§, μ½λλ₯Ό λ 볡μ‘νκ² λ§λ€ μλ μμ΅λλ€. μ λ€λ¦μ μ¬μ©νκΈ° μ μ μ₯λ¨μ μ λ°μ Έλ³΄μΈμ.
- νμ§ν λ° μΈκ³ν(l10n λ° g11n) κ³ λ €: λ€λ₯Έ μ§μμ μ¬μ©μμκ² νμν΄μΌ νλ λ°μ΄ν°λ₯Ό λ€λ£° λ, μ λ€λ¦μ΄ μ μ ν μμ λ° λ¬Ένμ κ΄μ΅μ μ§μνλμ§ νμΈνμΈμ. μλ₯Ό λ€μ΄, μ«μ λ° λ μ§ μμμ λ‘μΌμΌμ λ°λΌ ν¬κ² λ€λ₯Ό μ μμ΅λλ€.
κΈλ‘λ² μ»¨ν μ€νΈμμμ μμ
κΈλ‘λ² μ»¨ν μ€νΈμμ μ λ€λ¦μ μ΄λ»κ² μ¬μ©ν μ μλμ§ λͺ κ°μ§ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
ν΅ν λ³ν
interface ConversionRate {
rate: number;
fromCurrency: string;
toCurrency: string;
}
function convertCurrency<T extends ConversionRate>(amount: number, rate: T): number {
return amount * rate.rate;
}
const usdToEurRate: ConversionRate = { rate: 0.85, fromCurrency: "USD", toCurrency: "EUR" };
const amountInUSD = 100;
const amountInEUR = convertCurrency(amountInUSD, usdToEurRate);
console.log(`${amountInUSD} USDλ ${amountInEUR} EURμ κ°μ΅λλ€`); // Output: 100 USDλ 85 EURμ κ°μ΅λλ€
λ μ§ μμ μ§μ
interface DateFormatOptions {
locale: string;
options: Intl.DateTimeFormatOptions;
}
function formatDate<T extends DateFormatOptions>(date: Date, format: T): string {
return date.toLocaleDateString(format.locale, format.options);
}
const currentDate = new Date();
const usDateFormat: DateFormatOptions = { locale: "en-US", options: { year: 'numeric', month: 'long', day: 'numeric' } };
const germanDateFormat: DateFormatOptions = { locale: "de-DE", options: { year: 'numeric', month: 'long', day: 'numeric' } };
const japaneseDateFormat: DateFormatOptions = { locale: "ja-JP", options: { year: 'numeric', month: 'long', day: 'numeric' } };
console.log("λ―Έκ΅ λ μ§: " + formatDate(currentDate, usDateFormat));
console.log("λ
μΌ λ μ§: " + formatDate(currentDate, germanDateFormat));
console.log("μΌλ³Έ λ μ§: " + formatDate(currentDate, japaneseDateFormat));
λ²μ μλΉμ€
interface Translation {
[key: string]: string; // λμ μΈμ΄ ν€ νμ©
}
interface LanguageData<T extends Translation> {
languageCode: string;
translations: T;
}
const englishTranslations: Translation = {
"hello": "Hello",
"goodbye": "Goodbye",
"welcome": "Welcome to our website!"
};
const spanishTranslations: Translation = {
"hello": "Hola",
"goodbye": "AdiΓ³s",
"welcome": "Β‘Bienvenido a nuestro sitio web!"
};
const frenchTranslations: Translation = {
"hello": "Bonjour",
"goodbye": "Au revoir",
"welcome": "Bienvenue sur notre site web !"
};
const languageData: LanguageData<typeof englishTranslations>[] = [
{languageCode: "en", translations: englishTranslations },
{languageCode: "es", translations: spanishTranslations },
{languageCode: "fr", translations: frenchTranslations}
];
function translate<T extends Translation>(key: string, languageCode: string, languageData: LanguageData<T>[]): string {
const lang = languageData.find(lang => lang.languageCode === languageCode);
if (!lang) {
return `${languageCode}μμ ${key}μ λν λ²μμ μ°Ύμ μ μμ΅λλ€.`;
}
return lang.translations[key] || `${key}μ λν λ²μμ μ°Ύμ μ μμ΅λλ€.`;
}
console.log(translate("hello", "en", languageData)); // Output: Hello
console.log(translate("hello", "es", languageData)); // Output: Hola
console.log(translate("welcome", "fr", languageData)); // Output: Bienvenue sur notre site web !
console.log(translate("missingKey", "de", languageData)); // Output: deμμ missingKeyμ λν λ²μμ μ°Ύμ μ μμ΅λλ€.
κ²°λ‘
TypeScript μ λ€λ¦μ 볡μ‘ν λ°μ΄ν° νμ κ³Ό ν¨κ» μλν μ μλ μ¬μ¬μ© κ°λ₯νκ³ νμ μμ ν μ½λλ₯Ό μμ±νκΈ° μν κ°λ ₯ν λꡬμ λλ€. μ λ€λ¦μ κΈ°λ³Έ ꡬ문, κ³ κΈ κΈ°λ₯ λ° λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨ TypeScript μ ν리μΌμ΄μ μ νμ§κ³Ό μ μ§λ³΄μμ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. κΈλ‘λ² μ¬μ©μλ₯Ό μν μ ν리μΌμ΄μ μ κ°λ°ν λ, μ λ€λ¦μ λ€μν λ°μ΄ν° νμκ³Ό λ¬Ένμ κ΄μ΅μ μ²λ¦¬νλ λ° λμμ μ£Όμ΄ λͺ¨λ μ¬μ©μμκ² μνν μ¬μ©μ κ²½νμ 보μ₯ν μ μμ΅λλ€.