00189-easy-awaited

Back


type MyAwaited<T> = T extends PromiseLike<infer U> ? MyAwaited<U> : T;

Solution by gangukss #33589

type MyAwaited<T> =
  T extends Promise<infer R> | PromiseLike<infer P>
    ? MyAwaited<R | P>
    : T

Solution by Danny101201 #33559

type MyAwaited<T> = T extends PromiseLike<infer item> ? MyAwaited<item>  : T

Solution by Kolufs #33522

// 你的答案

type MyAwaited = T extends PromiseLike ? MyAwaited

: T

Solution by bad-lancer #33496

After the removal of the faulty test case, this is the new and much more concise solution

type MyAwaited<T> = 
T extends PromiseLike<infer Val> 
    ? MyAwaited<Val> 
    : T

Solution by pgoodbread #33382

// 여기 풀이를 입력하세요
type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U>
  ? U extends PromiseLike<any>
    ? MyAwaited<U>
    : U
  : never

Solution by awesomelon #33353

type MyAwaited<T> = T extends PromiseLike<infer R> ? MyAwaited<R> : T

Solution by daishi-motoyama #33310

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U> ? U extends PromiseLike<any>? MyAwaited<U>:U:never

Solution by Skytim #33293

type MyAwaited = T extends Promise ? S : never

Solution by rookiewxy #33240

type MyAwaited<T extends PromiseLike<any>> =  T extends PromiseLike<infer R> ? R extends PromiseLike<any>? MyAwaited<R> : R: never

Solution by xyida #33173

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer P> ?
 P extends PromiseLike<any> ? MyAwaited<P> : P 
: never

Solution by Tubring25 #33166

type MaybeAwaited<T> = T extends Partial<Promise<infer U>> ? MaybeAwaited<U> : T

type MyAwaited<T extends Partial<Promise<any>>> = MaybeAwaited<T>

Solution by JordanMoose #33077

// your answers

type MyAwaited<T> = T extends Promise<infer R>
  ? MyAwaited<R>
  : T extends { then: (callback: (args: infer Args) => unknown) => unknown }
    ? Args
    : T

Solution by KeithChou #33074

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U> ? U extends PromiseLike<any>? MyAwaited<U>: U : never;

Solution by RanungPark #33045

type MyAwaited<T> = T extends PromiseLike<infer R> ? MyAwaited<R> : T;

Solution by maxim-dmi3ev #33010

// 你的答案

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer Return> 
    ? Return extends PromiseLike<any> 
    ? MyAwaited<Return> 
    : Return 
    : never;

Solution by walker-hzx #32931

type UnwrapPromise<T> = T extends Promise<infer R> ? UnwrapPromise<R> : T;
type MyAwaited<T> = T extends { then: (onfulfilled: (arg: infer R) => any) => any } ? UnwrapPromise<R> : never;

Solution by YJCCreateAHistory #32897

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U>
                                              ? U extends PromiseLike<any>
                                                ? MyAwaited<U>
                                                : U
                                              : never;

Solution by Yasunori-aloha #32666

// 你的答案
type MyAwaited<T> = T extends PromiseLike<infer R> ? MyAwaited<R> : T

Solution by unmagic #32529

// 你的答案
type MyAwaited<T extends PromiseLike<unknown>> = T extends PromiseLike<infer R> ? R extends PromiseLike<unknown> ? MyAwaited<R> : R : never

示例:
type Result = MyAwaited<ExampleType> // string
type Result2 = MyAwaited<ExampleType2> // string

Solution by Jabo2017 #32502

// your answers
type MyAwaited<T> = T extends Promise<infer P> ? MyAwaited<P>: T extends {
   then: (onfulfilled: (arg: infer S) => any) => any }
 ? S : T

Solution by YuFengDing #32483

// your answers
type thenwrq<T> = Pick<Promise<T>, 'then'>
type MyAwaited<T extends thenwrq<any>> = T extends thenwrq<infer R>
  ? R extends thenwrq<any>
  ? MyAwaited<R>
  : R
  : never;

Solution by wrq1663 #32447

// your answers

Solution by wrq1663 #32446

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U> ? U extends PromiseLike<infer X> ? X extends PromiseLike<infer Z> ? Z : X : U : never

I don't think this is the best solution. How do you make a loop with the first one ?

Solution by solarpush #32168

type MyAwaited<T extends PromiseLike<any>> =
  T extends PromiseLike<infer F>
  ? (F extends PromiseLike<any> ? MyAwaited<F> : F)
  : never

If T doesn't extends from a promise, then we type as never (maybe T itself as well, in the test it really doesn't matter) if T extends from a promise of a type F that is not a promise, we type as F if F extends from a promise, we recursively type it as MyAwait<F>

The key here is infer keyword to extract the type of the promise

Solution by joyanedel #32129

type MyAwaited<T extends PromiseLike<any>> =  
  T extends PromiseLike<infer U>
    ? U extends PromiseLike<any>
      ? MyAwaited<U>
      : U
    : never
  1. PromiseLike 라는 타입에 대해 새로 알았다.
  2. MyAwaited 케이스에서 타입 에러를 발생 시키기 위해서 T extends PromiseLike 로 타입 범위 제한을 하는 법을 배웠다.

Solution by dev-hobin #32114

// your answers
type MyAwaited<T> = T extends PromiseLike<(infer R)>
  ? R extends PromiseLike<(infer V)> ? MyAwaited<V> : R
  : T

Solution by Rustamaha #31943


type MyAwaited<T> = T extends Promise<infer R> ? 
    R extends Promise<any> ?
    MyAwaited<R>:
    R 
  :never

Solution by kimud6003 #31833

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U> ? U extends PromiseLike<any> ? MyAwaited<U> : U : never

Solution by yosukekato165 #31710

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U> ?
U extends PromiseLike<any> ? MyAwaited<U> : U : never

Solution by yosukekato165 #31693