Chaque drapeau strict active un théorème. Encore faut-il savoir lequel.Each strict flag turns on a theorem. You just need to know which.
Le réglage du compilateur est le terrain le plus exposé au cargo cult : on copie un tsconfig trouvé en ligne sans savoir ce qu'il prouve. Or chaque drapeau strict active une garantie précise — un théorème que le compilateur s'engage à démontrer — pour un coût précis. Le plus fondamental, strictNullChecks : sans lui, null et undefined se glissent silencieusement dans tous les types, et un User peut être null sans que le type l'avoue. Avec lui, l'absence devient explicite, et le compilateur force à la traiter.Compiler configuration is the terrain most exposed to cargo cult: you copy a tsconfig found online without knowing what it proves. Yet each strict flag turns on a precise guarantee — a theorem the compiler commits to proving — for a precise cost. The most fundamental, strictNullChecks: without it, null and undefined silently slip into all types, and a User can be null without the type admitting it. With it, absence becomes explicit, and the compiler forces you to handle it.
// strictNullChecks: false → null et undefined se glissent dans TOUS les types function greet(user: User) { return "Bonjour " + user.name; // user pourrait être null… le type ne le dit pas } greet(null); // ✓ accepté ! 💥 null.name à l'exécution
Sans le drapeau, User signifie en secret « User ou null ou undefined » — le type ne prouve rien sur la présence. Avec, User veut dire User ; l'absence se déclare (User | null) et se prouve avant usage.Without the flag, User secretly means "User or null or undefined" — the type proves nothing about presence. With it, User means User; absence is declared (User | null) and proven before use.
// strictNullChecks: true → null/undefined deviennent explicites function greet(user: User) { // User n'inclut PLUS null return "Bonjour " + user.name; } greet(null); // ✗ Argument of type 'null' is not assignable to parameter of type 'User' — attrapé function greetMaybe(user: User | null) { if (user) return "Bonjour " + user.name; // ✓ on doit prouver la non-nullité return "Bonjour inconnu"; }
« Le compilateur est-il réglé pour prouver, ou pour laisser passer — et est-ce que je paie le bon prix ? » On ne touche à un drapeau qu'en comprenant le théorème qu'il active ou désactive, jamais en copiant un tsconfig trouvé en ligne."Is the compiler tuned to prove, or to let through — and am I paying the right price?" You only touch a flag by understanding the theorem it enables or disables, never by copying a tsconfig found online.
On garde le réglage du compilateur pour la fin — pas le début — exprès. Régler strict avant de comprendre l'effacement, le narrowing, any, les frontières, c'est cargo-culter. Maintenant qu'on a les théorèmes en tête, on peut décider lesquels activer en connaissance de cause. Beaucoup de ces drapeaux, on les a déjà croisés.We keep compiler config for the end — not the start — on purpose. Tuning strict before grasping erasure, narrowing, any, boundaries is cargo-culting. Now that the theorems are in mind, we can decide which to enable knowingly. Many of these flags we've already met.