ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TypeScript의 함수 3 (Polymorphism)
    개발언어/TypeScript 2022. 6. 12. 18:23

    Polymorphism

     

    다형성(polymorphise)이란 무엇일까?

    poly는 그리스어로 many,several,much,multi 라는 의미이다. polygon(다각형)같은 단어를 생각하면 된다. 더불어 morphos혹은 morphic은 form(형태), structure(구조)란 뜻을 가지고 있다. 즉  polymorphous란 여러가지 다른 구조들이라는 의미이다.

     

    기본적으로 함수는 여러가지 다른 모양을 가지고 있다. 앞서 말한 함수의 다형성에서 함수는 서로다른 2-3개의 인자를 가질 수 있다는 사실을 살펴보았다. 

     

    그리고 타입스크립트에서 함수는 string이나 object를 첫번째 인자로 가질 수 있다.

     

    그러니까 우리는 이미 약간의 여럭가지 모양의 다형성을 경험해 본 것이다.

     

     

    제네릭이 다형성에 어떻게 더 도움을 줄 수 있을까? =>

    예시)숫자로 이루어져 있는 배열을 받고, 그  배열의  요소를 하나씩  print 해주는 함수를 만들어 보자

    근데 위 함수의 문제는 number  type로 된 배열, boolean type으로 된 배열, object로 된 배열 등등 도 받아서 출력하고 싶다는 것이다. 

     

    그래서 일단 위의 코드와 같이 SuperPrint type의 함수에 boolean 형태의 배열인자를 받을 수 있는 call signture를 추가 한다.

     

    하지만 아직도 stirng type으로 배열을 보내면 제대로 작동하지 않는다. 그렇다면 다시  SuperPrint type 정의 영역에가서 stirng type의 배열을 받는 call signature를 추가 해주어야 할까? 그럴수 있지만 더 효유적이 방법이 존재한다.

     

    다형성을 활용하는 더 좋은 방법

    더 좋은 방법으로 우리는 ts에게 generic 타입을 받을 거라고 알려 줄 것이다. generic이란 타입의 placeholder 같은 것이다. concrete type을 사용하는 것 대신 쓸 수 있다. 우리는 ts로 placeholde를 작성할 수 있고, ts는 그것이 무엇이지 추론해서 함수를 사용하는 것이다.

     

    *concreate type : number, string, boolean, void, unknown,never 같은 type

     

     

    위와 같은 코드가 동작하지 않는 것은 이것들에 대한 call signature가 없기 때문이다. 하지만 작성하려고 하는 것은  오직 number type, boolean type, stirng type의 배열 일때만이 아니라 어떤 type의 인자가 들었는 배열이든 출력할 수 있는 함수 type이다.

     

    그렇다고 ,

    SuperPrint type에 위와 같은 call signture를 작성해서 문제를 해결하는 것은 좋은 방법은 아니다. 그렇다면, 다른 조합의 배열이 인자로 들어 올 때 를 대비해서 모든 경우의 수를 call sigture로 작성해야 하기 때문이다.

     

     

    Generic

    우리는 call signature를 작성할 때 , 여기 들어올 확실한 타입을 모를 때 generic을 사용한다. 함수 type을 정의할때 concrete type이 들어 올것 이라는 것을 빼고는 어떤 타입이 인자로 쓰일지 미리 알 수 없다.

     

    call signature를 작성하는 데 concrete type을 알 수 없을 때도 있다. 그런 경우에 generic을 이용한다.

    genecir을 사용하려면, 먼저 TypeScritp에 generic을 사용하고 싶다고 알려줘야 한다.

     

    위 그림의 코드가 ts에게 해당 call signature가 제네릭을 받는다는 걸 얄려주는 방법이다.

     

    모든 error가 사라진 것을 알 수 있다.

     

     ts는 superPrint가 사용될때 대입되어 지는 배열 인자의 값으로 타입을 유추하고  그 유추한 타입을 기본으로 call signature를 보여준다. 즉 우리가 Placeholder를 이용해서 call signature를 작성하면, ts는  Placeholder 대신 ts가 발견한 타입으로 뱌열의 타입을 정의한다.

     

    제네릭은 여전히 함수에 타입을 입력하는 것을 허용한다. 하지만 call signature를 만들때 배열의 type으로 들어갈 수 있는 경우의 수를 일일이 다 작성해주지 않아도 된다.

     

    superPrint를 배열이 아닌 배열의 요소를 return하는 함수로 변경 할 때

    call signature에 한 것은 ts에게 타입을 유추하도록 알려준 것이다. 그리고 그 타입의 배열이 될 것이라는 것을 인지 시키고, 그 타입 중 하나를 리턴하도록 하였다. 이런 것이 제네릭(generic)이고 , 제네릭을 사용할 수 있는 방법 중 하나 이다.

     

    [출처 - https://nomadcoders.co/typescript-for-beginners/lectures/3675]

    댓글

Designed by Tistory.