✔️ Typescript
다음으로...
예를 들어볼건데 배열을 받아, 그 배열의 결과를 print 해주는 함수를 만들어서 해다 요소를 하나씩 print 해준다.
정확히 말하자면, 숫자로 이루어져있는 배열을 받고, 숫자를 하나씩 출력해준다.
그리고 문자열로 이루어진 배열을 받아, 하나씩 출력해준다.
예 ) 숫자로 이루어진 배열의 요소 하나씩 출력하기
하지만 여기서 문제가 발생한다 !?
숫자뿐만 아니라 boolean 이나 객체의 형태인 배열을 받고 싶다면 어떻게 해야했을까?
쉽다!
arr 를 하나더 만들어서 boolean[] 으로 해주고 void 를 지정해주면 된다.
결과는...
그럼 이번에는 문자열 타입으로 배열을 보내면 어떻게 될까?
동작하지 않는다.
그러면 위에 처럼 똑같이 만들어야할까?
아니다!!!
이 때, 다형성을 활용한 더 좋은 방법이 있다.
type SuperPrint 한테 arr 의 타입들이 concrete type 이 아니라고 말해준다.
concrete type 이란?
이러한 것들이 concrete type 에 해당한다!
본론으로 돌아가서, 우리는 타입스크립트한테 generic 타입을 받을 알려주면 된다.
위의 코드처럼 concrete type 들을 작성할바에, generic 을 사용하면 된다!
예 ) 만약 argument 를 똑같은 타입이 아닌, 다양한 타입으로 구성된 배열이라면
경고가 뜨면서 동작하지 않는다.
작동하지 않는 이유는 call signature 가 없기 때문이다.
전처럼 해결하면...
이렇게 계속 아규먼트에 있는 요소 타입에 맞춰서 call signature 를 만들어야 한다.
이 때!!!
우리는 generic 를 사용한다.
Generic 을 사용하면 타입스크립트는 그 타입이 뭔지 알게 되고 타입스크립트가 그 타입을 유추한다.
우리가 call signature 를 작성할 때, 각자의 타입들을 모를 때 사용한다.
위의 argument 가 제네릭을 받는다고 알려준다.
해당 argument 앞에 꺽쇠로 이루어진 제네릭 이름을 넣어준다.
안의 이름은 아무것이나 넣어주면 된다.
보통 개발자들은 'T' 나 'V' 이렇게 한 글자를 넣어서 사용한다.
우리는 그리하여 타입스크립트한테 위의 call signature 가 제네릭을 받는다는 것을 알려준다.
concrete type 이 아닌 제네릭 이름을 해당 타입 대신 작성해준다.
그러면 위의 코드에서 봤듯이, 아무런 경고없이 작동한다.
argument 가 서로 다른 superPrint 함수들에 마우스를 갖다대면...
타입스크립트는 함수 안에 있는 arguments 를 확인해서 각 타입들을 유추한다.
그리고 유추한 타입으로 call signature 를 보여준다.
이것이 generic 에 핵심 개념이다.
보다시피 제네릭은 여전히 함수에 타입을 입력하는 것을 허용한다.
하지만 일일이 다 써줄 필요가 없어서 편리한 기능이다!
이번에는 superPrint 함수가 배열을 받아서 그 배열의 첫 번째 요소를 리턴하게 만들어준다.
void 에서 TypePlaceholder 로 바꾸면된다.
이게 바로 다형성 (polymorphism) 이다!
superPrint 함수는 많은 형태를 가지고 있어 generic 을 사용해준다!!!
일반 라이브러리들은 밑에 코드처럼 generic 을 쓴다.
아까 말했듯이, 간단히 T 로 대체해준다.
그리고 any 를 쓰지 않는 이유는 간단하다.
위에처럼 any 를 사용해도 경고는 뜨지 않는다.
하지만 더이상 지켜주지 않는다!
d 는 분명히 숫자 1을 리턴하지만, toUpperCase 메서드를 사용해도 경고가 없다.
그 이유는 any 타입을 사용해주었기 때문!
이렇게 타입스크립트 의도와 어긋나는 행동은 최대한 피해준다.
제네릭을 사용하면...
이렇게 경고가 발생한다.
더 나아가서...
SuperPrint 타입 제네릭을 하나 더 추가하고 싶다고 하면...
예 ) 두 개의 아규먼트가 있다면...
에러들을 확인해보면...
한개의 argument 가 아니라 두개의 arguments 가 필요한다고 말한다.
해결방법은...
아규먼트를 하나더 작성해준다.
결과적으로...
이렇게 하나의 고정된 타입이 아닌 다양한 타입을 가지고 있는 아규먼트를 작성해주면 된다.
끝으로 :