본문 바로가기
Typescript

generic

by 루에 2022. 1. 6.
반응형

함수를 콜할 때 타입 정보를 함께 넘겨줘서 하나의 함수로 다양한 타입으로의 콜이 가능하다.

기본형은 아래와 같다.

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에는 없기 때문
}

 

반응형

댓글