/**
* Obtain the return type of a function type
*/
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
ReturnType, es5 타입스크립트 기본 라이브러리에 들어있는, 함수의 리턴 타입을 알아내는 타입 함수(?)다.
infer 키워드는 extends 구문에서, 아무데에나 들어가서 그 위치에 들어갈 수 있는 최대한의 타입을 유추한다. 그리고 그것을 extends 문이 참일 때 반환될 구문에서 사용할 수 있다.
위 함수를 보면 문제점을 하나 알 수 있는데, 함수가 입력에 따라서 반환값의 타입이 바뀌는 경우 이를 정확히 찾아낼 수 없다는 것이다. 이를 해결하기 위해서 GetReturnType이라는 함수를 만들어 보자.
type GetReturnType<T extends (...args : any) => any, Args extends any[]> = T extends (...args : Args) => infer A ? A : never;
type F = ((input : number) => number) | ((input : string) => string);
type A = GetReturnType<F, any>; // number | string
type N = GetReturnType<F, [number]>; // number
type S = GetReturnType<F, [string]>; // string
편안...
입력의 타입에 따라서 알맞는 반환값이 튀어나오는 모습을 볼 수 있다.