function swap<T, U>(a: T, b: U) {
return [b, a];
}
const [a, b] = swap("1", 2);
console.log(a, b); // "2" 1
타입변수는 여러개 사용 가능하다
function returnFirstValue(data: any) {
return data[0];
}
let num = returnFirstValue([0, 1, 2]); // 0
let str = returnFirstValue(["hello", "mynameis"]); // "hello"
→ returnFirstValue
의 리턴타입이 any
이기 때문에 num
과 str
값도 any
타입으로 추론된다.
returnFirstValue
을 제네릭 함수로 바꾸면 다음과 같은 오류가 발생한다.function returnFirstValue<T>(data: T) {
return data[0]; // ❌오류 → unknown에다가 배열 인덱스 쓰지마라.
}
function returnFirstValue<T>(data: T[]) {
return data[0];
}
data
는 (number|string)[]
타입으로 추론되기 때문function returnFirstValue<T>(data: T[]) {
return data[0];
}
let num = returnFirstValue([0, 1, 2]); // number
let str = returnFirstValue([1, "hello", "mynameis"]); // string | number
number
) 추론하게 만드는 방법은 다음과 같다.function returnFirstValue<T>(data: [T, ...unknown[]]) {
return data[0];
}
let num = returnFirstValue([0, 1, 2]);
let str = returnFirstValue([1, "hello", "mynameis"]);
→ 튜플타입: 특정 인덱스에 해당하는 요소의 타입을 지정
※ 참고:
...unknown[]
※
타입에서 사용하는 rest parameter와 같은 것
any
라면 var4
에서 오류를 나타내지 않는다.function getLength(data: any) {
return data.length;
}
let var1 = getLength([1, 2, 3]); // 3
let var2 = getLength("12345"); // 5
let var3 = getLength({ length: 10 }); // 10
let var4 = getLength(10); // undefined
extends
로 T의 타입 제한 )function getLength<T extends { length: number }>(data: T) {
return data.length;
}
let var1 = getLength([1, 2, 3]);
let var2 = getLength("12345");
let var3 = getLength({ length: 10 });
let var4 = getLength(10); // ❌오류
extends
로 타입변수의 조건을 달아 제한