Promise<T> décrit la valeur de succès — et seulement elle.Promise<T> describes the success value — and only it.
async/await a l'air d'être la partie de TypeScript qui rend enfin l'asynchrone sûr et lisible comme du code synchrone. Pour le chemin du succès, c'est vrai : Promise<User> nomme exactement ce qu'on obtiendra si ça résout. Mais le type ne raconte que la moitié de l'histoire. Le T est la valeur résolue, rien d'autre — la branche du rejet est totalement absente du type. Lire Promise<User> comme « ça me donne un User » oublie le « ou ça lève quelque chose, qu'aucun type ne décrit ».async/await looks like the part of TypeScript that finally makes asynchrony safe and readable like synchronous code. For the success path, it's true: Promise<User> names exactly what you'll get if it resolves. But the type tells only half the story. The T is the resolved value, nothing else — the rejection branch is entirely absent from the type. Reading Promise<User> as 'it gives me a User' forgets the 'or it throws something, which no type describes'.
async function getUser(id: string): Promise<User> { const res = await fetch("/u/" + id); return res.json(); // le type dit Promise<User> : succès garanti, croit-on } const user = await getUser("42"); // user : User — MAIS si ça rejette, on saute ICI user.name; // jamais atteint en cas d'erreur — et l'erreur n'est pas typée
Une promesse a deux issues — résoudre ou rejeter — mais son type n'en nomme qu'une. Promise<T> est honnête sur le succès et muet sur l'échec ; la moitié de l'histoire manque, et c'est la moitié qui plante.A promise has two outcomes — resolve or reject — but its type names only one. Promise<T> is honest about success and silent on failure; half the story is missing, and it's the half that crashes.
async function getUser(id: string): Promise<User> { /* ... */ } // ^^^^^^^^^^^^^ décrit la valeur de SUCCÈS, uniquement const user = await getUser("42"); // user : User — SI la promesse résout // le rejet ? invisible dans le type. await le relance, et c'est un 'unknown' au catch (8.2)
« Ce Promise<T> — qu'est-ce qu'il garantit vraiment, et qu'est-ce qu'il ne dit pas ? » La réponse, à chaque fois : il garantit la forme du succès (T), et ne dit rien de l'erreur. Demande toujours ce que le type tait."This Promise<T> — what does it really guarantee, and what does it not say?" The answer, every time: it guarantees the success shape (T), and says nothing of the error. Always ask what the type withholds.
Le volume le plus piégeux côté types, parce que le plus rassurant en surface. Ce premier numéro cartographie la moitié typée — ce que Promise<T>, await et async garantissent réellement. Le suivant affronte la moitié absente : l'erreur, qui n'est jamais dans le type, et pourquoi le catch est unknown.The trickiest volume type-wise, because the most reassuring on the surface. This first issue maps the typed half — what Promise<T>, await and async actually guarantee. The next confronts the missing half: the error, never in the type, and why catch is unknown.