189 - Awaited
// 你的答案
type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer U>
? U extends PromiseLike<any>
? MyAwaited<U>
: U
: never;
This one passes the test for
type T = { then: (onfulfilled: (arg: number) => any) => any }
👍
type MyAwaited<T> = T extends PromiseLike<infer U> ? U : never
Why U is extending PromiseLike and not just Promise?
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
type MyAwaited<T> = T extends PromiseLike<infer T> ? MyAwaited<T> : T; Try this
Promise类型需要满足 Promise A+ 的一切标准,但是开发者自己实现的 Promise 有可能并不标准,比如只有 .then 方法。我认为这是为什么使用 PromiseLike 类型的原因
Reference: infer keyword PromiseLike
type MyAwaited<T extends PromiseLike<any>> = Awaited<T>; this also works ???
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
type MyAwaited<T> = T extends PromiseLike<infer U> ? MyAwaited<U> : T
type MyAwaited<T extends PromiseLike<any>, U = T> = U extends PromiseLike<infer R> ? MyAwaited<U, R> : U
type MyAwaited<T> =
T extends PromiseLike<infer K>
? K extends PromiseLike
type MyAwaited<T> = T extends PromiseLike<infer D> ? MyAwaited<D> : T;
what about this?
type MyAwaited<T> = T extends PromiseLike<infer U> ? U: never