μ œλ„€λ¦­(Generics)μ΄λž€?

νƒ€μž…μ„ 마치 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ²˜λŸΌ λ™μ μœΌλ‘œ μ§€μ •ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

즉, ν•¨μˆ˜, μΈν„°νŽ˜μ΄μŠ€, 클래슀, νƒ€μž…μ—μ„œ μ—¬λŸ¬ νƒ€μž…μ„ μœ μ—°ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°λŠ₯이닀.

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ νƒ€μž…μ•ˆμ •μ„±μ„ μœ μ§€ν•˜λ©΄μ„œλ„ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€!

μ œλ„€λ¦­ ν•¨μˆ˜

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]

객체λ₯Ό λΉ„κ΅ν•˜κ±°λ‚˜ ν‚€-κ°’ μŒμ„ ν‘œν˜„ν•  λ•Œλ„ μ œλ„€λ¦­ μ œμ•½ 쑰건을 μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ“šΒ μ œλ„€λ¦­ ν™œμš© μ˜ˆμ‹œ