타입스크립트의 제네릭이란.
타입스크립트에서는 클래스나 함수의 생성자 또는 인자 파라미터 옆에 있는 제네릭 <>으로
클래스와 함수 내부에 타입을 전송해줄 수 있다.
이를 통해 함수 호출이나 클래스로 객체를 만들 때,
타입을 <> 안으로 전송하여 내부에서 전송된 타입을 사용가능하게한다.
하지만
number 타입만 가능한 숫자 연산,
string, array 타입만 사용 가능한 length 프로퍼티,
혹은 다른 자료형, 타입에서 고유로 존재하는 기능을 사용하려고했을 때,
클래스나 함수 내부의 기준에서는 <MyType>으로 지정한 제네릭 타입에
어떤 타입이 들어올것인지 확실하지가않기에 저렇게 에러가 나온다.
즉, 파라미터가 (x: string) 으로 직접적인 타입 설정이됐다면 문제가 나지않지만,
결국 MyType은 함수 호출 시 제네릭으로 타입을 입력받기때문에
함수 호출 전까지 계속 타입이 미정 상태인것이다.
따라서 위의 예시같은 함수의 선언 시, x가 아직 어떤 타입인지 모르는데 x - 1을 수행할 수 없으니
narrowing같은 작업이 필요하게된다.
따라서 저런 경우에는 narrowing이 필요하다.
물론 이런 방법을 쓰는게 일반적이긴하지만
이렇게 제네릭에 extends를 사용해
파라미터에 넣을 수 있는 타입을 직접적으로 제한할 수 있다.
extends 한 자료형이 아닌 타입이 인자로 들어온 경우
저렇게 에러가나게 할 수 있다.
여기서 extends는 상속의 개념이 아니라 제네릭 타입이 extends한 타입의 속성을
갖고있는지 검사해주는 기능을 갖는다.
이를 통해 파라미터로 넣는 값의 타입을 제한할 수 있다.
역시 기본 타입 외에
이런 커스텀 타입, 인터페이스를 extends 하게하는것도 가능하다.
참고로
꼭 클래스나 함수가 아니더라도 제네릭 사용이 가능하다.