Asynchroniczność
Awaited
To, co zostaje po await — niezależnie od tego, jak głęboko była zagnieżdżona obietnica.
Czym jest
Jedyne wbudowane na tej stronie, które się rekurencyjnie zagłębia. Modeluje `await`, a nie rozpakowanie `Promise`: obietnica obietnicy spłaszcza się dokładnie tak jak w czasie wykonania, a to, co obietnicą nie jest, przechodzi bez zmian. Przeczytanie definicji to najszybszy sposób, by zrozumieć, dlaczego zagnieżdżone obietnice nigdy nie były czymś, czym trzeba się zajmować.
Przykłady
Awaited<Promise<string>>→stringAwaited<Promise<Promise<number>>>→numberSpłaszczone do końca, bo `await` robi to samo.
Awaited<string>→stringAwait na nie-obietnicy jest legalny i nic nie robi, a typ to odzwierciedla.
Każdy rozwinięty typ powyżej wypisał TypeScript 5.9.3, nie ręka człowieka.
Czego nie robi
- Nie rozpakowuje niczego wewnątrz obiektu. `Awaited<{ a: Promise<string> }>` pozostaje bez zmian — to podąża za `await`, a `await` nie chodzi po twoich właściwościach.
- Nie opisuje odrzucenia. Ścieżka błędu nie ma w TypeScripcie żadnego typu i dlatego złapany błąd jest `unknown`.
Wniosek
Używaj `Awaited<ReturnType<typeof fn>>` dla rozwiązanego wyniku funkcji asynchronicznej. Ta para pojawia się częściej niż każde z osobna.