이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
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를 리턴한다.
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 8-Readonly 2 (medium) (0) | 2023.03.12 |
---|---|
타입챌린지 : 3-Omit (medium) (0) | 2023.03.11 |
타입챌린지 : 3312-Parameters (easy) (0) | 2023.03.06 |
타입챌린지 : 3060-Unshift (easy) (0) | 2023.03.06 |
타입챌린지 : 3057-Push (easy) (0) | 2023.03.06 |