반응형
함수를 콜할 때 타입 정보를 함께 넘겨줘서 하나의 함수로 다양한 타입으로의 콜이 가능하다.
기본형은 아래와 같다.
function func41<T>(param: T): T {
return param;
}
let v41 = func41<string>("문자");
let v42 = func41<number>(3333);
let v43 = func41<boolean>();
T는 다른 이름으로도 가능하지만, 일반적으로 T를 많이 쓴다.
T는 여러개여도 가능하다.
function func41<T1, T2, T3>(param: T): T1 | T2 | T3 {
return param;
}
// 타입을 전부다 개수에 맞게 지정하거나 아예 타입을 안쓰는 경우가 있다.
let v41 = func41<string, number, boolean>("문자");
let v42 = func41(3333); // 아예 지정하지 않을 경우 타입은 unknown이 된다.
T는 extends가 가능하다. 하지만 타입에서 extends란 상속이나 복사되는 개념이 아니라 오히려 리터럴 타입에 가깝게 extends 한 타입만 들어올 수 있도록 제한하는 기능이다. primitive type 뿐만 아니라 사용자 정의 타입도 가능하다.
function func41<T extends string | number>(param: T): T {
return param;
}
let v41 = func41<string>("문자");
let v42 = func41<number>(1);
let v43 = func41<boolean>(true); // 에러(extends에 boolean이 없음)
아래처럼 사용자 정의 타입도 extends 할 수 있지만, 함수 본문에서처럼 특정 값을 참조하는 경우는 extends 한 타입들이 해당 속성을 가지고 있어야 한다.
interface Phone {
length : number
}
function func42<T extends string | number | Phone>(param: T): number {
return param.length; // 여기에서 에러가 발생한다. string과 Phone에는 length라는 속성이 있지만 number에는 없기 때문
}
반응형
댓글