lxxmnmn / type-challenges

TypeScript type challenges
https://tsch.js.org/
MIT License
0 stars 0 forks source link

189 - Awaited #8

Open lxxmnmn opened 3 months ago

lxxmnmn commented 3 months ago

Awaited easy #promise #built-in

Promise와 같은 타입에 감싸인 타입이 있을 때, 안에 감싸인 타입이 무엇인지 어떻게 알 수 있을까요? 예를 들어 Promise<ExampleType>이 있을 때, ExampleType을 어떻게 얻을 수 있을까요?

/* _____________ Your Code Here _____________ */

// type MyAwaited<T> = T extends PromiseLike<infer U> ? U : never;
// Promise가 중첩된 경우도 고려하여 재귀적으로 정의
type MyAwaited<T> = T extends PromiseLike<infer U> ? MyAwaited<U> : T;
/* _____________ Test Cases _____________ */

import type { Equal, Expect } from '@type-challenges/utils'

type X = Promise<string>
type Y = Promise<{ field: number }>
type Z = Promise<Promise<string | number>>
type Z1 = Promise<Promise<Promise<string | boolean>>>
type T = { then: (onfulfilled: (arg: number) => any) => any }

type cases = [
  Expect<Equal<MyAwaited<X>, string>>,
  Expect<Equal<MyAwaited<Y>, { field: number }>>,
  Expect<Equal<MyAwaited<Z>, string | number>>,
  Expect<Equal<MyAwaited<Z1>, string | boolean>>,
  Expect<Equal<MyAwaited<T>, number>>,
]
lxxmnmn commented 3 months ago

infer 키워드

// U가 추론 가능한 타입이면 true, 아니면 false
T extends infer U ? X : Y