[TS] 타입스크립트 Generic에 대한 이해와 활용

2022. 7. 1. 00:06·Learning-Log/Computer Science
728x90
320x100

첫 번째 인자로 어떤 Array를 받아와서 두 번째 인자로 입력된 값을 Array의 가장 마지막에 추가하는 함수를 생각해보자.
TS로 이 함수를 작성하려면 다음과 같이 작성 가능하다.

type AddItem = <T,M>(arr:(T|M)[], item : M) => (T|M)[]

const addItem : AddItem = (arr, item) => {
  arr.push(item); 
  return arr
  }

 

이 때, arr: (T | M)[ ] 부분이 이해가 안갈 수 있다.
<M>은 item에서 정해져야할 것 같은데 arr에서 <T | M>을 쓰면 뭔가 엉키지 않을까?

결론부터 말하면 엉키지 않는다.

위 코드를 작성한 뒤 TS의 Call Signature를 뜯어보자.

addItem의 첫 인자만 전달한 상태

위 사진에서 볼 수 있듯 첫 번째 인자인 arr까지만 작성한다면, 첫 번째 인자와 두 번째 인자가 generic <M>을 공유하고 있으므로 너무나도 당연하게 두 번째 인자인 item의 Type도 arr와 같다고 나온다. 하지만, 두 번째 인자를 입력하면 어떻게 될까?

두 번째 인자까지 입력한 상태

보시다시피, 두 번째 인자를 입력하고나니, item의 Type으로서 string이 정확히 표시된다.

arr와 같은 Type을 item에 입력한 경우

더 나아가, arr와 같은 Type을 item에 입력해도 문제 없이 작동하는 것을 볼 수 있다.

 

번외

질문의 대상이 된 코드

Q : 배열 안에는 아무 타입이나 올 수 있는데 왜 V타입을 넣을 수 없다는 에러가 뜨나요?

A : Typescript이기 때문입니다. 비록 Generic 타입을 설정해주긴 했지만, Generic은 any가 아닙니다. 즉, prepend 함수의 첫 번째 인자로 전달되는 Array의 각 항목이 지닌 Type을 T가 받아가는 것일뿐, 그것이 곧 모든 Type을 다 허용한다는 뜻이 아닙니다. 따라서, T와 V가 항상 같으리라는 보장이 없으므로 Typescript는 에러를 띄우게 됩니다.

 

 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Learning-Log > Computer Science' 카테고리의 다른 글

[TS] 타입스크립트의 기초(2) - Class와 상속, 그리고 interface와 type의 차이점  (1) 2022.07.05
[TS] 타입스크립트의 기초(1) - type 키워드 및 Type에 대한 이해  (0) 2022.07.05
[NPM] 패키지 설치시 더 이상 '--save' 플래그를 입력하지 않아도 되는 이유  (0) 2022.06.24
[JS] 자바스크립트의 배열(Array)은 배열이 아니다.  (2) 2022.06.19
[VSCode] remote.wsl:connection Method 를 알아보자  (1) 2022.06.19
'Learning-Log/Computer Science' 카테고리의 다른 글
  • [TS] 타입스크립트의 기초(2) - Class와 상속, 그리고 interface와 type의 차이점
  • [TS] 타입스크립트의 기초(1) - type 키워드 및 Type에 대한 이해
  • [NPM] 패키지 설치시 더 이상 '--save' 플래그를 입력하지 않아도 되는 이유
  • [JS] 자바스크립트의 배열(Array)은 배열이 아니다.
Xpectation
Xpectation
理
    반응형
  • Xpectation
    자기실현적 기대
    Xpectation
  • 전체
    오늘
    어제
    • 전체보기 (216)
      • Thinking-Log (42)
        • 인간에 관한 생각 (22)
        • 사회현상에 관한 생각 (9)
        • 말씀에 관한 생각 (4)
        • 기타 잡념 (7)
      • Trading-Log (8)
        • 주식 잡념 (9)
      • Learning-Log (104)
        • Computer Science (70)
        • Economics (21)
        • Law (1)
        • ETC (12)
      • Review-Log (45)
        • 食思味 (14)
        • 聽思聰 (6)
        • 視思明 (12)
        • IT 제품, 전자기기 (7)
        • 게임 (0)
        • 기타 (6)
      • Creating-Log (5)
        • 주방 (0)
        • 서재 (5)
        • 기타 (0)
      • Photo-Log (3)
        • 사진 일기 (3)
      • 미분류 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 태그
  • 링크

    • 티스토리 홈
  • 공지사항

  • 인기 글

  • 태그

    딥러닝
    주식
    오블완
    마인드위즈Pro
    클래식음악
    경제학
    티스토리챌린지
    수면유도
    매매일지
    ASMR
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.1
Xpectation
[TS] 타입스크립트 Generic에 대한 이해와 활용
상단으로

티스토리툴바