Promise.all lance en parallèle — et rend un tuple typé, position par position.Promise.all runs in parallel — and returns a typed tuple, position by position.
On a souvent plusieurs opérations asynchrones indépendantes. Les enchaîner par des await successifs les sérialise sans raison : la seconde attend la première. Les combinateurs lancent tout de front — et leurs types réservent des subtilités qu'on néglige. Promise.all est le plus utile : il attend que tout résolve, et rend un tuple où chaque position garde son type exact. Pas un tableau de l'union des types : un tuple [User, Post[]], déstructurable proprement.You often have several independent async operations. Chaining them with successive awaits serializes them for no reason: the second waits for the first. Combinators launch everything at once — and their types hold subtleties that get overlooked. Promise.all is the most useful: it waits for all to resolve, and returns a tuple where each position keeps its exact type. Not an array of the union of types: a tuple [User, Post[]], cleanly destructurable.
const user = await fetchUser(); // attend… const posts = await fetchPosts(); // …puis attend (alors qu'ils sont indépendants) // sérialisé sans raison : posts n'avait pas besoin d'attendre user
Promise.all apporte deux choses : le parallélisme à l'exécution, et un tuple au niveau type — [A, B], pas (A | B)[]. Chaque résultat ressort avec son type d'origine, prêt à être déstructuré.Promise.all brings two things: parallelism at runtime, and a tuple at the type level — [A, B], not (A | B)[]. Each result comes back with its original type, ready to destructure.
const [user, posts] = await Promise.all([fetchUser(), fetchPosts()]); // ^^^^ ^^^^^ chacun son TYPE : user : User, posts : Post[] // lancés en parallèle, et Promise.all rend un TUPLE typé position par position
« Quel combinateur, et que dit son type ? » all rend un tuple mais rejette en bloc ; allSettled ne rejette jamais mais rend des unions ; race rend une union. Choisir le combinateur, c'est choisir un comportement et une forme de type."Which combinator, and what does its type say?" all returns a tuple but rejects wholesale; allSettled never rejects but returns unions; race returns a union. Choosing the combinator is choosing a behavior and a type shape.
Après le succès seul (8.1) et l'erreur non typée (8.2), voici la composition. Les combinateurs ont des types soignés — un tuple pour all, une union discriminée pour allSettled — mais aussi des pièges d'inférence (tableau vs tuple) et des comportements de rejet qu'il faut connaître pour choisir juste.After success-only (8.1) and the untyped error (8.2), here's composition. The combinators have careful types — a tuple for all, a discriminated union for allSettled — but also inference pitfalls (array vs tuple) and reject behaviors you must know to choose right.