Wzorce
Jak przyjąć callback zwracający `T` albo `Promise<T>` i zawsze wystawić jeden przewidywalny wynik?
Przyjmij wartość lub obietnicę, oczekaj jej i opisz spłaszczony wynik przez `Awaited`.
Przepis
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')
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
type MaybePromise<T> = T | Promise<T>Kontrakt callbacku dopuszcza implementacje natychmiastowe i odroczone.
- 02
Promise<Awaited<T>>
Publiczny wynik jest zawsze asynchroniczny, a zagnieżdżone obietnice są spłaszczane.
Co dostajesz
typeof syncResult→Promise<number>typeof asyncResult→Promise<string>Awaited<typeof asyncResult>→string
Gdzie to zawodzi
Zwracane API jest zawsze asynchroniczne, nawet dla synchronicznego callbacku. Nie używaj tej otoczki, gdy wywołujący polegają na natychmiastowych wyjątkach lub zakończeniu w tym samym takcie.
Wniosek
Ujednolicaj elastyczne wejścia na granicy, by każdy wywołujący konsumował jeden stabilny kształt wyniku.
