
function returnFirstValue<T>(data: T[]){
return data[0];
}
위의 함수는 배열 파라미터가 들어왔을 때, 배열의 첫번째 요소를 리턴시켜주는 함수이다.
그렇기 때문에 다음과 같이
function returnFirstValue<T>(data: T[]){
return data[0];
}
let str = returnFistValue([1, "hello", "typescript"]);
함수를 실행시켰을 때, str에는 파라미터의 첫번째 요소인 1이 할당되겠지만, str 타입자체는 number와 string을 허용하는 유니온타입이 될 것이다.
이럴 경우, 리턴값은 number인데 타입이 다소 포괄적으로 잡히게 된다.
이를 방지하기 위해서 제네릭함수의 타입을 선언할 때,
function returnFirstValue<T>(data: [T, ...unknown[]]){
return data[0];
}
let str = returnFirstValue([1, "hello", "typescript"]);
위와 같이 rest parameter 문법을 사용했을 경우, str의 값에는 1이 할당되고, 타입 또한 T에 해당하는 값의 타입은 number이기 때문에, str의 타입도 number로 정의된다.
제네릭 함수를 사용할 때, 우리는 특정 프로퍼티를 필수값으로 선정함으로써 타입을 제한할 수 있다.
function getLength<T extends { length : number } >(data : T){
return data.length;
}
위처럼, T extends { length : number } 라고 했을 때, 파라미터로 받는 T는 반드시 length라는 프로퍼티를 가지고 있어야한다.
그렇기 때문에 허용되는 파라미터의 타입은
getLength("string");
getLength([1,2,3]);
getLength({length : 3});
위와 같이 length 프로퍼티를 가지고 있는 객체로 제한되게 된다.
출처 : 인프런 - 한 입 크기로 잘라먹는 타입스크립트