Typescript: 제너릭

타입스크립트에 두 매개변수는 서로 다른 타입일수 있다고 말해준다.
그럼 타입 스크립트는 이것을 보고 데이터를 활용하겠구나라고 이해할수 잇다.
이제 미상의 객체가 아니라 특정한 타입이라는 것을 추정한다.
뭐가 될지 모르겠지만 어떤 타입이긴 할거라고 알려주는 기능이다.
제약조건

30을 넣었을때 object.assign 이 되지 않는다. ( 당연히 object 가 아니기 때문) 하지만 여기에서 에러가 발생하지 않고 그냥 객체가 반환되는 문제점이 생긴다.
이유> t u 가 object 타입이라는것을 알려주지 않았기 때문이다.
따라서 제약 조건을 사용해야된다.

이렇게 타입을 지정해준다.

element.length 를 사용한다 .element 의 타입이 T인데 T의 성질을 모르기 때문에 성립이 안된다.1
따라서 T extends (number . ) 대신에 interrface를 통해서 length 의 타입을 지정해준다.
length 속성이 포함되어서

return 할때 하나는 T( 제너릭 타입) 이고 하나는 string 타입으로 배열을 배출하라고 알려준다.
제너릭을 사용하는 이유는 변수와 같다고 생각하면된다 어떤 타입을 쓸지는 모르겠는데 우선 이타입을 반복해서 사용하고 싶다.
너무 많은 작업을 반복해서 하고 싶지 않다. 할때 사용한다.
keyof

여기서는key 가 정말 존재할지 안할지 보장할수 없다.

key of 을 통해 key 값을 준다는 것을 명시했음에도 여전히 에러가 발생하는것을 볼수 있다.
이유는 {} 값만 줬고 여기에 key 값을 주지 않았기 때문이다.!
제네릭 클래스
클래스 함수를 이용하여 제너릭 클래스를 만든다 .


인스턴스를 만들때 T 에 대한 타입을 지정해준다.
문제점!

object 타입을 만든후 remove item 를 실행해도 안되는 문제점이 발생하였다.

안되는ㅇ ㅣ유
removeItem() 에게 넣은 것은 객체여서 객체는 만들때 바로 새로운 주소가 할당되어서 이전에 만들었던 max 와 다른
주소를 갖고 있기때문에 remove 할수 없다. .
고치는 방법

maxobj 를 만들어서 객체를 만든다. > 주소를 할당
그 만든 maxobj 를 넣으면 같은 주소를 가리키고 있는거 이기 때문에 제대로 작동하는 것을 볼수 있다.
2) 다른 방법

이전에는 object 로 할당했기 때문에 문제가 발생한거다. 따라서 이 타입은 object 를 허용하지 않는다고 알려주면
처음부터 인스턴스를 만들수 없게 된다
클래스 뿐만아니라 함수에서도 당연히 제널릭을 사용할수 있다.
제너릭 유틸리티 타입

object 를 만들때에도 타입을 지정해줘야되는데 지정해주지 않아서 생기는 문제점이다.

여기에 Partial 타입을 지정해준다. 이의미는 나중에 courseGoal 타입이 될 객체라는 것을 알려주는것이다.
아직 CorusGoal 생성되지 않았기 때문에
return courseGoal as CourseGoal 이라고 지정해줘야된다.

주어진 타입으로 return 된다.



