Patrones
¿Cómo acepto callbacks que devuelven `T` o `Promise<T>` y expongo siempre un resultado predecible?
Acepta un valor o promesa, espéralo y describe el resultado aplanado con `Awaited`.
La receta
type MaybePromise<T> = T | Promise<T> async function run<T>( task: () => MaybePromise<T>, ): Promise<Awaited<T>> { return (await task()) as Awaited<T> } const syncResult = run(() => 42) const asyncResult = run(async () => 'ready')
La compilación compila esto y comprueba cada resultado de abajo.
Cómo funciona
- 01
type MaybePromise<T> = T | Promise<T>El contrato permite implementaciones inmediatas y diferidas.
- 02
Promise<Awaited<T>>
El resultado público es siempre asíncrono y las promesas anidadas se aplanan.
Lo que obtienes
typeof syncResult→Promise<number>typeof asyncResult→Promise<string>Awaited<typeof asyncResult>→string
Dónde falla
La API resultante siempre es asíncrona, incluso para un callback síncrono. No uses este envoltorio si los llamantes dependen de excepciones inmediatas o finalización en el mismo ciclo.
Conclusión
Normaliza entradas flexibles en el límite para que todos consuman una forma de salida estable.
