TypeScript -6-

mh·2022년 5월 3일
0

TypeScript

목록 보기
6/17
post-thumbnail

Photo by Mathias P.R. Reding on Unsplash

generic vs any

배열로 모든 타입을 받고 배열의 첫번째 요소를 리턴하는 함수를 작성한다 가정

any를 쓰지 않는 이유

아무타입을 받고 아무타입이나 리턴하는 함수 -> any?

any사용시

type SuperPrintAny = (a:any[]) => any

const superPrintAny: SuperPrintAny = (a) => a[0]

const anyA = superPrintAny([1,2,3,4])

anyA.toUpperCase() // anyA는 number기 때문에 런타임 오류 발생

anyA.toUpperCase()는 오류가 발생하는 코드임에도 불구하고 아무 경고도 해주지 않는걸 볼 수 있음

generic 사용시

type SuperPrint = <T>(a:T[]) => T

const superPrint: SuperPrint = (a) => a[0]

const a = superPrint([1,2,3,4])

a.toUpperCase()
  • a는 숫자이기때문에 오류가 발생할 것이라고 코드가 실행되기전에 TS에서 경고해줌

  • generic은 사용자가 요구한대로 call signature를 생성해주는 도구

generic 추가하기

  1. 첫번째 generic(T)뒤에 ,를 붙인뒤 이름을 지어줌, 여기서는 M을 썼음
  2. M이 어디에 사용될건지 알려줘야 함
  3. (a:T[], b:M) -> 두번째 인수로 사용하겠다 <- 이부분이 TS가 타입을 알게 되는 부분
  4. 두 개의 인자를 받아야 하므로 함수 실행문에 두번재 인수 "x" 추가
type SuperPrint = <T,M>(a:T[], b:M) => T

const superPrint: SuperPrint = (a) => a[0]

const a = superPrint([1,2,3,4],"x")
const d = superPrint([1,"ab",true,"123"],[])
  • TS는 generic을 처음 인식했을때와 generic의 순서를 기반으로 generic의 타입을 알게 됌

  • <T,M> <- generic의 이름을 설정해주는 단계

  • (a: T[], b:M ) <- generic이 사용되는 곳을 알려주는 단계 -> T는 함수의 첫번째 파라미터로 올 것이다. 두번째는 M이 올것이다 -> 파라미터로 들어오는 값을 인식 -> 파라미터로 ([1,2,3,4],"x")가 들어올때 첫번째 파라미터 [1,2,3,4]의 경우 숫자, 두번째 파라미터 "x"의 경우 문자열로 인식

  • 이 단계에서 TS가 call signature를 작성

  • any와는 작동방식이 다름 -> 개발자가 요구하는대로 call signature를 생성한다는 뜻

  • generic의 call signature - 같은 함수라도 다른 call signature 생성해줌

profile
🤪🤪🤪🤪🤪

0개의 댓글