타입 챌린지 2 - Get Return Type

소파의 벨로그·2025년 3월 4일

타입챌린지

목록 보기
13/131
post-thumbnail

문제 링크

문제

내장 제네릭 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

0개의 댓글