type-challenges icon indicating copy to clipboard operation
type-challenges copied to clipboard

189 - Awaited

Open fyuanz opened this issue 3 years ago • 15 comments

// 你的答案
type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U>
  ? U extends PromiseLike<any>
    ? MyAwaited<U>
    : U
  : never;

fyuanz avatar Mar 13 '23 08:03 fyuanz

This one passes the test for

type T = { then: (onfulfilled: (arg: number) => any) => any }

👍

jknight avatar Apr 22 '23 15:04 jknight

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

1292150917 avatar Sep 20 '23 11:09 1292150917

Why U is extending PromiseLike and not just Promise?

damasceno-dev avatar Nov 10 '23 12:11 damasceno-dev

Why U is extending PromiseLike and not just Promise?

I've found the answer myself, its to cover cases like type T = Promise<{ then: (onfulfilled: (arg: number) => any) => any }> The default tests cases are all covered without this though

damasceno-dev avatar Nov 14 '23 18:11 damasceno-dev

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

ceilingyear avatar Dec 20 '23 07:12 ceilingyear

Promise类型需要满足 Promise A+ 的一切标准,但是开发者自己实现的 Promise 有可能并不标准,比如只有 .then 方法。我认为这是为什么使用 PromiseLike 类型的原因

tototi5997 avatar Jan 24 '24 07:01 tototi5997

Reference: infer keyword PromiseLike

MarvinXu avatar Mar 20 '24 04:03 MarvinXu

type MyAwaited<T extends PromiseLike<any>> = Awaited<T>; this also works ???

dzevad-cyber avatar Mar 31 '24 22:03 dzevad-cyber

Why is 'Awaited' written like this in the TypeScript official doc https://www.typescriptlang.org/docs/handbook/utility-types.html#awaitedtype

type MyAwaited<T extends { then: (onfulfiled: (arg: any) => any) => any }> = T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode
  T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped
    F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument
      Awaited<V> : // recursively unwrap the value
      never : // the argument to `then` was not callable
    T

KenjiGinjo avatar May 02 '24 08:05 KenjiGinjo

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

yurnery avatar Jul 04 '24 06:07 yurnery

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

pangxie231 avatar Jul 31 '24 13:07 pangxie231

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

qingzhoufeihu avatar Aug 11 '24 03:08 qingzhoufeihu

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

lewton avatar Aug 26 '24 07:08 lewton

what about this?

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

kemalmao19 avatar Sep 30 '24 12:09 kemalmao19