
내장 제네릭 ReturnType<T>을 이를 사용하지 않고 구현하세요.
type MyReturnType<T extends Function> =
T extends ((...arg:any)=>infer R)?
R
:never
대부분 비슷한 풀이였다.
다만 실제 ReturnType의 선언은 다음과 같았다.
type ReturnType<T extends (...args: any) => any>
= T extends (...args: any) => infer R ? R : any

이 풀이에 싫어요가 많이 달려있길래 Function 키워드가 뭔지 궁금해 찾아봤다.
Function의 선언은 다음과 같다
// lib.es5.d.ts
interface Function {
apply(this: Function, thisArg: any, argArray?: any): any;
call(this: Function, thisArg: any, ...argArray: any[]): any;
bind(this: Function, thisArg: any, ...argArray: any[]): any;
toString(): string;
prototype: any;
readonly length: number;
arguments: any;
caller: Function;
}
Function 타입에는 호출 형식이 없다.
그렇기에 실제 ReturnType에서는 호출 형식이 있는 타입이 들어갈 수 있기 때문에, 제네릭에 Function이 들어갈 수 없고,
MyReturnType에서는 호출 형식이 없어도 Function을 상속하는 타입이면 제네릭에 들어 갈 수 있다. 다만, 이 경우 MyReturnType에서도 Function의 호출부가 없기 때문에 never가 나오게 된다

https://stackoverflow.com/questions/64380905/difference-between-function-and-args-any-any
https://github.com/microsoft/TypeScript/issues/20007