본문 바로가기
Language/Typescript

타입챌린지 : 2-Get Return Type (medium)

by hsloth 2023. 3. 8.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00002-medium-return-type/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

 

type MyReturnType<T> = T extends (...args: any[]) => infer K ? K : never;

// test case
type cases = [
  Expect<Equal<string, MyReturnType<() => string>>>,
  Expect<Equal<123, MyReturnType<() => 123>>>,
  Expect<Equal<ComplexObject, MyReturnType<() => ComplexObject>>>,
  Expect<Equal<Promise<boolean>, MyReturnType<() => Promise<boolean>>>>,
  Expect<Equal<() => 'foo', MyReturnType<() => () => 'foo'>>>,
  Expect<Equal<1 | 2, MyReturnType<typeof fn>>>,
  Expect<Equal<1 | 2, MyReturnType<typeof fn1>>>,
]

type ComplexObject = {
  a: [12, 'foo']
  bar: 'hello'
  prev(): number
}

const fn = (v: boolean) => v ? 1 : 2
const fn1 = (v: boolean, w: any) => v ? 1 : 2

 

type MyReturnType<T> = T extends () => infer K ? K : never;

처음에는 이렇게 작성했었다. 하지만 () => infer K 는 함수의 인자가 없는 함수를 가리키나보다.

맨 마지막 케이스 두 개가 통과가 되지 않았다. 그래서 args를 추가해주었다...

 

type MyReturnType : T를 제네릭으로 갖는 MyReturnType을 정의한다.

T extends (...args: any[]) => infer K ? K : never; : T가 K를 리턴하는 함수를 상속한다면, K를 리턴하고 아니면 never를 리턴한다.