generic

박동건·2022년 6월 1일

Typescript

목록 보기
3/3
post-thumbnail

타입스크립트는 제네릭이 처음 사용되는 지점을 기반으로 이 타입이 무엇인지 알게 된다.
(그래서 요구한 대로 call signature를 생성해 준다.)

아래에 예시와 함께 바로 살펴보자.

type SuperPrint = {
    (arr: number[]): void
    (arr: boolean[]): void
}

const superPrint: SuperPrint = (arr) => arr[0]
    
superPrint([1,2,3,4])
superPrint([true,false,true,true])

만약에 아래와 같은 함수를 추가로 실행하려고 할 때 어떻게 해야하는가?

superPrint([1,2,true,true])

또 다시, call signature에 아래와 같이 추가를 해주어야 하는가?

type SuperPrint = {
    (arr: number[]): void
    (arr: boolean[]): void
    (arr:(number|boolean)[]): void // 추가???
}

추가를 했는데 만약에 아래와 같은 함수를 추가로 실행하려고 할 때, 또 추가해주어야 하는가?
일일이 다 추가적으로 써줘야 하는가?


superPrint([1,2,true,true,'hello'])

이러한 경우 아래와 같이 수정할 수 있다.

type SuperPrint = <T>(arr: T[]) => T // 대문자로 시작
// 함수를 선언하면서, 바로 제네릭을 사용 할 수도 있다.
 function superPrint<T> (a: T[]) {
     return a[0]
 }

위의 코드는 타입스크립트에게 타입을 유추하도록 알려주는 것이다.
이는 T라는 어떤 타입이 들어오면 arr의 타입이 T가 될 것이고, T의 타입을 리턴한다는 뜻이다.

generic은 인자들과 반환값에 대하여 타입에 따라 그에 상응하는 타입을 갖는다.

any와의 차이점은 해당 타입에 대한 정보를 잃지 않는다는 것이다.

any는 any로서 밖에 알 수 없지만, generics는 타입 정보를 알 수 있다.


결론 :

직접 모든 call signature를 작성하는 것 보다 generic을 사용하는게 훨씬 용이하다.

profile
박레고의 개발 블로그

0개의 댓글