Le catch reçoit un unknown — parce qu'un rejet peut être n'importe quoi.The catch receives an unknown — because a reject can be anything.
Le numéro précédent l'a annoncé : Promise<T> ne dit rien de l'échec. On le constate ici, au catch. Le réflexe est d'écrire catch (e: any) et de lire e.message — comme si toute erreur était un Error. Mais en JavaScript, on peut throw n'importe quoi : une chaîne, un nombre, un objet nu. TypeScript le sait, et type donc e en unknown : impossible d'y toucher sans prouver d'abord (Vol 4.2). Le any qu'on met à la place n'est pas une solution — c'est le retour du trou, à l'endroit le plus exposé.The previous issue announced it: Promise<T> says nothing of failure. You meet it here, at the catch. The reflex is to write catch (e: any) and read e.message — as if every error were an Error. But in JavaScript, you can throw anything: a string, a number, a bare object. TypeScript knows this, and types e as unknown: you can't touch it without proving first (Vol 4.2). The any you put instead isn't a solution — it's the hole returning, at the most exposed spot.
try { await risky(); } catch (e: any) { // any : on suppose une forme d'erreur log(e.message.toUpperCase()); } // 💥 si le code a fait 'throw "boom"' : "boom".message est undefined → crash dans le catch
Un rejet n'a aucune forme garantie : throw accepte tout. catch (e: any) suppose ce qu'il ne sait pas ; unknown dit la vérité — on ne connaît pas l'erreur — et force à la prouver avant de la lire.A reject has no guaranteed shape: throw accepts anything. catch (e: any) assumes what it doesn't know; unknown tells the truth — you don't know the error — and forces you to prove it before reading.
try { await risky(); } catch (e) { // e : unknown — on ne SAIT pas ce qui a été lancé if (e instanceof Error) { log(e.message.toUpperCase()); // ✓ ici e : Error — prouvé } else { log("erreur non-Error : " + String(e)); // l'autre cas, géré honnêtement } }
« Je ne connais pas le type de l'erreur d'une promesse. » Donc je la traite comme l'unknown qu'elle est — je prouve (instanceof) avant de lire —, et si j'ai vraiment besoin du type d'erreur, je le modélise, je ne le suppose pas."I don't know a promise's error type." So I treat it as the unknown it is — I prove (instanceof) before reading — and if I genuinely need the error type, I model it, I don't assume it.
Le numéro précédent montrait que Promise<T> ne décrit que le succès. Voici la conséquence directe : à l'arrivée d'un rejet, le système de types n'a rien à offrir — juste unknown. Tout ce numéro consiste à vivre honnêtement avec ce vide, plutôt que de le masquer d'un any.The previous issue showed Promise<T> describes only success. Here's the direct consequence: when a reject arrives, the type system has nothing to offer — just unknown. This whole issue is about living honestly with that void, rather than masking it with an any.