Tout l'édifice repose sur des déclarations — et une déclaration peut mentir.The whole edifice rests on declarations — and a declaration can lie.
Le système de types est une preuve. Mais toute preuve part d'axiomes — et ici, les axiomes sont les déclarations qu'on n'a pas écrites : les .d.ts des bibliothèques, les @types tiers, les declare posés sur du JavaScript nu. Un .d.ts peut affirmer n'importe quoi sur du code qui fait autre chose. Si une déclaration annonce number là où la lib renvoie un string, le compilateur te croit vert — et le runtime plante. Ta garantie de type n'est jamais plus forte que la déclaration la plus faible sur le chemin.The type system is a proof. But every proof starts from axioms — and here, the axioms are the declarations you didn't write: libraries' .d.ts, third-party @types, the declare laid over bare JavaScript. A .d.ts can assert anything about code that does otherwise. If a declaration claims number where the lib returns a string, the compiler tells you green — and the runtime crashes. Your type guarantee is never stronger than the weakest declaration on the path.
// dans un .d.ts fourni par la lib (ou un @types tiers) : declare function parseAmount(raw: string): number; const total = parseAmount(input); // le compilateur croit : number total.toFixed(2); // 💥 la lib renvoie en réalité un string → crash // le .d.ts a AFFIRMÉ 'number' ; le JavaScript réel n'a jamais tenu cette promesse
Une declare n'est pas une preuve : c'est une affirmation qu'on signe sur du code qu'on n'a pas vérifié — un as à l'échelle d'un module. Là où elle est douteuse, on revient au seul recours honnête : valider à la frontière.A declare isn't a proof: it's an assertion you sign over code you didn't verify — an as at module scale. Where it's doubtful, you return to the only honest recourse: validate at the boundary.
// On ne fait pas confiance aveugle à une déclaration externe douteuse : const raw: unknown = parseAmount(input); // on retype en unknown (7.1) const total = AmountSchema.parse(raw); // on VALIDE à la frontière (7.2) total.toFixed(2); // ✓ prouvé à l'exécution, pas sur parole
« Ma garantie n'est jamais plus forte que la déclaration la plus faible sur le chemin. » Aux frontières des libs non typées ou mal typées, je suis revenu, exactement, au Vol 7 : je ne fais pas confiance, je valide."My guarantee is never stronger than the weakest declaration on the path." At the boundaries of untyped or mistyped libs, I'm back, exactly, at Vol 7: I don't trust, I validate.
Tout ce qu'on a construit — formes, narrowing, invariants, génériques, types calculés, frontières, async, réglages — tient sur des déclarations qu'on n'a pas relues. Ce dernier numéro montre la limite ultime : le compilateur ne prouve que ce qu'on lui a déclaré vrai, et il n'a aucun moyen de savoir si une déclaration ment sur le JavaScript qu'elle décrit.Everything we built — shapes, narrowing, invariants, generics, computed types, boundaries, async, settings — rests on declarations we never reread. This final issue shows the ultimate limit: the compiler proves only what you declared true, and it has no way to know whether a declaration lies about the JavaScript it describes.