condicional usando tipagem:
T extends U ? never : T
extends semelhante ao ==
nas condições de logica padrão, se devolver never
isso significa que a tipagem em si sera removida.
<aside> 💡 obs: creio eu que só funciona usando type
</aside>
type MyAwaited<T extends Promise<any>> = T extends PromiseLike<infer A>
? A extends Promise<any>
? MyAwaited<A>
: A
: T;
type Y = Promise<{ field: number }>;
type Z = Promise<Promise<string | number>>;
type Z1 = Promise<Promise<Promise<string | boolean>>>;
type result = MyAwaited<Y>
// {field: number}
type result = MyAwaited<Z>
// string | number
type result = MyAwaited<Z>
// string | boolean
esse map é para obter a tipagem de uma Promise, deep map pra ser mais exato (deep map por obter as tipagem de niveis mais internos)
Vamos por partes:
type MyAwaited<T extends Promise<any>> = ...
definindo o nome da tipagem como MyAwaited
e adicionando um tipo genérico T
definindo ele por padrão sempre ira receber uma Promise<any>
(Promise de qualquer coisa basicamente)
T extends PromiseLike<infer A> ...
enfim a tipagem começa com uma condição, se o tipo genérico T
for igual uma PromiseLike
(com a tipagem dela sendo inferida no tipo genérico A
).