νμ μ λ§μΉ ν¨μμ νλΌλ―Έν°μ²λΌ λμ μΌλ‘ μ§μ ν μ μλλ‘ ν΄μ€λ€.
μ¦, ν¨μ, μΈν°νμ΄μ€, ν΄λμ€, νμ μμ μ¬λ¬ νμ μ μ μ°νκ² μ²λ¦¬ν μ μλλ‘ λμμ£Όλ κΈ°λ₯μ΄λ€.
μ λ€λ¦μ μ¬μ©νλ©΄ νμ μμ μ±μ μ μ§νλ©΄μλ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±ν μ μλ€!
function identity<T>(value: T): T {
return value;
}
const string = identity("Hello"); // string νμ
μΌλ‘ μλ μΆλ‘
const string = identity(10); // number νμ
μΌλ‘ μλ μΆλ‘
<T>λ₯Ό ν΅ν΄ νμ μ μΈλΆμμ κ²°μ ν μ μλλ‘ νκ³ , λ§€κ° λ³μμ νμ μ νΈμΆ μμ μ κ²°μ νλ€.
μλμ κ°μ κ²½μ°μ κΈ°λ³Ένμ μ μ§μ ν μ½λμ΄λ€.
function identity<T = string>(value: T): T {
return value;
}
const string = identity(); // κΈ°λ³Έκ° string
const number = identity<number>(10) // λͺ
μμ μ€μ
interface Box<T> {
value: T;
}
const stringBox: Box<string> = { value: "Square" };
const numberBox: Box<number> = { value: 30 };
console.log(stringBox.value.toUpperCase()); // "SQUARE"
console.log(numberBox.value.toFixed(2)); // "30.00"
class Stack<T> {
private items: T[] = [];
push(item: T){
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
}
const numberStack = new Stack<number>();
numberStack.push(1)
numberStack.push(2)
console.log(numberStack.pop()); // 2
console.log(numberStack.pop()); // 1
function printLength<T extends { length: number }>(value: T): void {
console.log(value.length);
}
printLength("GetLength"); // β
9
printLength([1, 2, 3]); // β
3
// printLength(123); // β μ€λ₯ (numberμλ lengthκ° μμ)
μ΄λ κ² μμ±νλ©΄ νμ
μ λν κ°μ λ μλμ§λ§ length
μ λν΄ λμνλ μΈμλ§ λ겨λ°μ μ μκ² λλ€.
function getProperty<T, O extends keyof T>(obj: T, key: O) {
return obj[key];
}
let obj = { a: 1, b: 2, c: 3 };
getProperty(obj, "a"); // okay
getProperty(obj, "z"); // error: "z"λ "a", "b", "c" μμ±μ ν΄λΉνμ§ μμ΅λλ€.
function pair<K, V>(key: K, value: V): [K, V] {
return [key, value];
}
const result = pair("id", 123); // ["id", 123]
κ°μ²΄λ₯Ό λΉκ΅νκ±°λ ν€-κ° μμ ννν λλ μ λ€λ¦ μ μ½ μ‘°κ±΄μ μ¬μ©ν μ μλ€.