T, U 등) 동시에 사용할 수 있음extends를 사용하면 타입 변수에 제한(제약 조건)을 걸 수 있음function swap<T, U>(a: T, b: U) {
return [b, a];
}
const [a, b] = swap("1", 2);
// a: number, b: string
T = string, U = number로 추론됨function returnFirstValue<T>(data: T[]) {
return data[0];
}
let num = returnFirstValue([0, 1, 2]);
// number
let str = returnFirstValue([1, "hello", "mynameis"]);
// number | string
T[]를 매개변수 타입으로 설정하면 T는 요소의 타입으로 추론됨T는 number | stringfunction returnFirstValue<T>(data: [T, ...unknown[]]) {
return data[0];
}
let str = returnFirstValue([1, "hello", "mynameis"]);
// number
T로 고정...unknown[])extends)function getLength<T extends { length: number }>(data: T) {
return data.length;
}
getLength("123"); // ✅ OK
getLength([1, 2, 3]); // ✅ OK
getLength({ length: 1 }); // ✅ OK
getLength(undefined); // ❌ 오류
getLength(null); // ❌ 오류
T extends { length: number }는 T가 최소한 length 프로퍼티를 가지고 있어야 함제네릭은 단순히 타입을 일반화하는 것이 아니라
상황에 맞는 타입 정확성과 제한을 추가하는 도구이다.
적절히 활용하면 코드의 안정성과 유연성이 크게 향상된다.