문제
Promise
와 같은 타입에 감싸진 타입이 있을 때, Promise
내부에 감싸진 타입이 무엇인지 어떻게 알 수 있을까요?
예를 들어, Promise<ExampleType>
이 있을 때 ExampleType
을 어떻게 얻을 수 있을까요?
type ExampleType = Promise<string>
type Result = MyAwaited<ExampleType> // string
풀이
먼저 error를 내야하는 케이스를 고려해줍니다.
제네릭 타입으로는 Promise
에 감싸진 타입 혹은, then
을 메서드로 가지는 Promise와 같은 타입을 받아야 합니다.
이 경우가 아니라면 error를 내도록 Promise<any>
를 extends
하도록 제네릭 T
를 제한해줍니다.
그 다음 Promise
내부의 타입에 접근합니다. infer
를 사용해줍니다.
먼저 T extends Promise<infer U>
로 Promise
내부의 타입에 접근하기 위한 변수 U
를 선언합니다.
만약, U
에 접근할 수 없다면 never
로 처리합니다.
반복적으로 Promise
로 감싼 타입도 고려해야 합니다.
U
가 다시 한번 Promise
에 감싸져 있다면, 재귀함수로 처리해주고 그렇지 않다면 U
타입을 바로 반환합니다.
그런데 ❗ 이렇게 작성하면 마지막 케이스를 통과하지 않습니다.
마지막 케이스는 Promise
로 묶인게 아니라 Promise
의 동작과 비슷하게 then
메서드를 가진 타입입니다.
이런 경우는 어떻게 처리할까요?
정답
타입스크립트에서는 이런 경우를 처리하기 위해 PromiseLike
라는 타입을 지원합니다.
Promise
타입들을 PromiseLike
로 바꿔주면 모든 케이스를 통과하게 됩니다.
Promise
와 PromiseLike
에 대해 더 알고싶다면? ⬇️
https://jaenny-dev.tistory.com/5#article-1-2-
'Frontend > Type-Challenge' 카테고리의 다른 글
[타입챌린지/type-challenge] Readonly (0) | 2023.01.26 |
---|---|
[타입챌린지/type-challenge] Pick (0) | 2023.01.26 |
[타입챌린지/type-challenge] Includes (2) | 2023.01.25 |
[타입챌린지/type-challenge] First of Array (0) | 2023.01.23 |
[타입챌린지/type-challenge] Hello World (0) | 2023.01.23 |