

마지막 인자가 호출되어야 실행되는 커리함수가 있다. 커리함수의 타입은 어떻게 지정해야할까?

지금은 t를 제외한 나머지 인자들은 unknown으로 추론되고 있다. 한번 수정해보자.

이미지에서 처럼 제네릭U, V는 첫 번째 인자를 바라보고 있다. 제네릭은 항상 function call에 물려있기 때문이다


가령 <number, number, number> 을 추가해주면 정상 작동한다.
하지만 제네릭 타입을 명시하게 되면 타입스크립트는 런타임에서 타입 추론을 하지 않는다. 그럼 제네릭을 사용하는 이유도 없어지는 것.

즉, 커링함수가 단계별로 각각 제네릭하게 타입을 추론해야하는 것이다.
제네릭을 내부함수 각 호출부로 변경해주면

첫번째 함수 (T) number로 추론

두번째 함수 (U) number로 추론

마지막 함수 (V)까지 number로 추론하게된다.


결과적으로 인자의 타입을 변경해도 유연하게 추론해준다.

엄청 어려운 문제는 아닌데, 유니언, 키맵핑 개념이 확실하지 않아 헷갈렸던 문제다.

어디서나 볼 수 있는 key로 객체에서 value를 가져오는 함수다.
제네릭 TObj로 받고 key는 keyof TObj로 정했다.

함수를 호출해보면

에러가 나온다 오잉??

결과값이 유니언인 것!
즉, 함수getValue 에서 추론이 잘못되고 있다는 것인데, obj 에 다른 타입의 속성을 추가해보면


반환타입이 유니언으로 추가되어 나온다. 이런 사태를 방지해보자
getValue를 살펴보자

key가 유니언으로 infer되는 것을 확인할 수 있다.

이런 식으로 key가 타입 추론이 되어 있는 것이다. key의 타입을 keyof TObj 가 아닌 다른 방식으로 추론해줘야 한다.

깔끔하게 두번째 제네릭을 추가해준다. 그럼 컴파일 에러가 뜰 것이다.

이제 TKey에 constraint을 해준다.


멋진 추론

테스트도 모두 통과다.

makeSelectors 는 함수는 말그래도 셀렉터를 관리하는 함수다.

뭔가 타입을 제대로 한 거 같은데, 여기저기 에러가 나온다.
makeSelectors<TSource, TSelectors>() 이렇게 두 제네릭한 인자를 넘길 때,
첫 번째 타입 인자(TSource)는 명시적으로 넘기고, 두 번째 타입 인자(TSelectors)는 함수 인자(실제 값)로부터 추론받고 싶다.
하지만, 타입스크립트는 부분 추론을 지원하지 않는다.
즉, <TSource, TSelectors> 모두 명시해야 하거나, 모두 추론에 맡겨야 한다.
이 문제는 커링으로 해결할 수 있다. 커링으로 타입 인자를 두 번에 나눠서 전달함으로써 추론을 유도하는 것이다.

화살표 함수를 추가하여 내부 함수를 한 번 더 반환하게 만들었다. 그리고 1번 문제에서 했던 것처럼 제네릭의 뎁스를 아래로 낮춰주면 된다.


이렇게 되면 첫 번째 호출에서 타입 인자 명시만 하면 두 번째 호출에서 타입 추론이 된다.
참고 : total tyhpescript