제네릭은 C#, Java 등의 언어에서 재사용성이 높은 컴포넌트를 만들 때 자주 활용되는 특징이다.
특히, 한가지 타입보다 여러 가지 타입에서 동작하는 컴포넌트를 생성하는데 사용된다.
위 코드에는 T가 순서대로 세 개가 있다.
첫 번째 : 함수 호출 시 넘겨주는 타입
두 번째 : 함수 매개변수 타입
세 번째 : 함수 반환 타입
getText<string>('hi');
getText<number>(10);
getText<boolean>(true);
이런 식으로, 타입스크립트에서는 호출할 때 함수 안에서 사용할 타입을 넘겨준다.
이 것이 첫 번째 T의 차리를 차지하는 것이다.
function getText<string>(text: T): T {
return text;
}
함수의 매개변수의 타입을 정해준다.
getText<string>('hi');
함수의 매개변수로 string 을 보내고 있음이 확인된다.
function getText<string>(text: string): T {
return text;
}
함수의 반환 타입을 결정한다.
이 함수에서는 매개변수를 그대로 출력해주고 있기 때문에 반환값이 string 으로 같다.
function getText<string>(text: string): string {
return text;
}
function getText(text: any): any {
return text;
}
any 는 어떤 타입이 들어와도 상관이 없다.
T도 마찬가지로 string, number, boolean 등 어떤 타입이 들어와도 상관이 없다.
그렇다면 위의 코드처럼 any를 쓰지 않고 왜 제너릭을 사용하는 것일까?
같은 함수 내에 쓰이는 T는 모두 같은 타입이기 때문이다.
function getText<T>(text: T): T {
return text;
}
이렇게 쓰는 것에서, 하나의 T가 string 임이 확실해졌다면, 다른 T도 string이어야 한다.
만약 반환값은 다른 타입을 쓰고 싶다면 아래와 같이 써야할 것이다.
function getText<T>(text: T): any {
return text;
}
참조