Vol. 4 · № 01 · Un atelier TypeScriptA TypeScript workshop

any, le trou, ou éteindre la lumière any, the hole, or turning off the lights

On met any, l'erreur disparaît, on passe à autre chose. Mais any n'est pas un type : c'est l'interrupteur qui débranche le vérificateur. La faute de frappe, le champ absent, la méthode inventée — tout passe, et le bug revient intact au runtime. Pire : any déteint, il recontamine en silence tout le code en aval. C'est l'unsafe de TypeScript. You slap on any, the error vanishes, you move on. But any isn't a type: it's the switch that unplugs the checker. The typo, the missing field, the invented method — all pass, and the bug returns intact at runtime. Worse: any bleeds, silently re-contaminating all the downstream code. It's TypeScript's unsafe.

AudienceAudience
Dev qui met any pour faire passer les types et ne voit pas le coût caché Dev who reaches for any to make the types pass and misses the hidden cost
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026 Jun 2026
≈ 18 min ●●○○ anyPropagationTradeoff
SommaireContents ·
№ 01CadrageFraming3 min

any ne corrige rien. Il éteint la lumière — et le bug revient à l'exécution.any fixes nothing. It turns off the lights — and the bug returns at runtime.

C'est le réflexe qui ouvre le volume : un type récalcitrant, on met any, l'erreur disparaît, on passe à autre chose. Mais any n'est pas un type — c'est l'interrupteur qui débranche le vérificateur. La faute de frappe, le champ absent, la méthode inventée : tout passe. On n'a pas réglé le problème, on a juste éteint l'avertissement. Le bug, lui, attend tranquillement le runtime. C'est l'unsafe de TypeScript.It's the reflex that opens the volume: a stubborn type, you slap any on it, the error vanishes, you move on. But any isn't a type — it's the switch that unplugs the checker. The typo, the missing field, the invented method: all pass. You didn't solve the problem, you just turned off the warning. The bug, meanwhile, quietly waits for runtime. It's TypeScript's unsafe.

any — l'erreur est masquée, pas régléeany — the error is hidden, not fixed
function totalPrice(cart: any): number {
  return cart.items.reduce((s, it) => s + it.prce, 0);
  //          ^ items peut être absent       ^ 'prce' : faute de frappe
}                          // aucune erreur : any a éteint TOUTE vérification
// 💥 au runtime : cart.items undefined → crash, ou un NaN qui se propage
Où l'erreur est-elle attrapée ?Where is the error caught?
Paramètre anyany parameter
jamais — puis 💥 au runtimenever — then 💥 at runtime
le vérificateur est débranchéthe checker is unplugged
Type réelReal type
à la compilation, sur la fauteat compile time, on the typo
le bug n'atteint pas l'exécutionthe bug never reaches runtime

any ne déplace pas l'erreur, il la rend muette : elle ressurgit identique à l'exécution, loin de l'endroit qu'on relit. Le type réel, lui, fait protester le compilateur là où on écrit la faute.any doesn't move the error, it mutes it: it resurfaces unchanged at runtime, far from the spot you review. The real type makes the compiler protest where you write the mistake.

Le type réel — la lumière reste alluméeThe real type — the lights stay on
type Cart = { items: { price: number }[] };

function totalPrice(cart: Cart): number {
  return cart.items.reduce((s, it) => s + it.prce, 0);
  //                                          ^ ✗ 'prce' n'existe pas — attrapé
}                          // le bug n'atteint jamais l'exécution
Le réflexe du numéroThe issue's reflex

« Est-ce que je connais ce type, ou est-ce que j'abandonne la vérification — et est-ce que je le sais ? » any abandonne en silence. Avant de l'écrire, demande-toi si l'erreur que tu fais taire n'était pas un fait vrai sur ton code."Do I know this type, or am I abandoning the check — and do I know it?" any abandons silently. Before writing it, ask whether the error you're silencing wasn't a true fact about your code.

Pourquoi ce numéro ouvre le Vol 4.Why this issue opens Vol 4.

Le volume du « faire taire le compilateur ». On commence par le pire des silences : celui qui ne dit pas son nom. any ne se contente pas de masquer une erreur — il déteint, et c'est l'objet du chapitre suivant. unknown (4.2) et as (4.3) sont les façons honnêtes de faire ce qu'any fait en douce.The volume of 'silencing the compiler'. We begin with the worst silence: the one that doesn't announce itself. any doesn't just hide an error — it bleeds, which is the next chapter's subject. unknown (4.2) and as (4.3) are the honest ways of doing what any does on the sly.

№ 02La surpriseThe surprise4 min

any ne reste pas où on l'a mis. Il déteint sur tout ce qu'il touche.any doesn't stay where you put it. It bleeds onto everything it touches.

On croit le any local — confiné à la variable qu'on a annotée. Faux. Tout ce qu'on dérive d'un any est, à son tour, any : un accès à une propriété, un retour de fonction, un élément de tableau. Une seule valeur any plantée au fond d'une chaîne recontamine, en silence, du code pourtant correct en aval. Le trou ne reste pas un trou : il s'étend.You think any is local — confined to the variable you annotated. Wrong. Anything derived from an any is, in turn, any: a property access, a function return, an array element. A single any value planted deep in a chain silently re-contaminates downstream code that was otherwise correct. The hole doesn't stay a hole: it spreads.

Une source d'any, toute une chaîne contaminéeOne source of any, a whole chain contaminated
const data: any = fetchUntyped();   // une SEULE source d'any

const user = data.user;   // user : any   ← déteint
const name = user.name;   // name : any   ← déteint
const out  = name.toUpperCase().tooFixed();   // ✗ méthode inventée
//                              ^ aucune erreur : any a contaminé toute la chaîne
// 💥 au runtime : name.toUpperCase() est un string, .tooFixed n'existe pas

Le any de data coule dans user, puis name, puis l'appel final. Chaque maillon hérite du trou sans le moindre signal. Le code en aval avait l'air typé — il ne l'est plus, et personne ne l'a décidé. C'est ça, la vraie nuisance d'any : pas l'erreur qu'il masque, mais celles qu'il laissera passer ailleurs.The any on data flows into user, then name, then the final call. Each link inherits the hole without a single signal. The downstream code looked typed — it isn't anymore, and no one decided that. That's any's real harm: not the error it hides, but the ones it will let through elsewhere.

Une erreur de type reste où elle naît. Un any voyage — il transforme en zone non vérifiée tout ce qu'il effleure en aval.A type error stays where it's born. An any travels — it turns everything it brushes downstream into an unchecked zone.
№ 03La mécaniqueThe mechanics5 min

Le seul type à double sens — et celui qui s'invite sans qu'on l'écrive.The only two-way type — and the one that lets itself in unwritten.

Pourquoi any déteint ? Parce qu'il est assignable dans les deux sens : tout type monte dans any, et any redescend dans tout type. Un vrai type est à sens unique — il n'accepte que ce qui est compatible. any abolit la barrière dans les deux directions, et c'est exactement ce qui le fait couler partout. Pire : il n'a pas toujours besoin qu'on l'écrive. Sans annotation, certains endroits prennent un any implicite — d'où le drapeau noImplicitAny, le plus important du volume.Why does any bleed? Because it's assignable both ways: every type flows up into any, and any flows back down into every type. A real type is one-way — it only accepts what's compatible. any abolishes the barrier in both directions, and that's exactly what lets it flow everywhere. Worse: it doesn't always need to be written. Without an annotation, some spots take an implicit any — hence the noImplicitAny flag, the volume's most important.

Le va-et-vient — any est assignable dans les deux sensThe two-way street — any is assignable both ways
let a: any = 5;
const s: string = a;   // ✓ any → string : descend dans N'IMPORTE QUEL slot typé
const n: number = a;   // ✓ any → number : aussi
let b: any;
b = "texte"; b = 42; b = {};   // ✓ tout → any : tout y monte aussi
L'any implicite — le trou qu'on n'a pas écritThe implicit any — the hole you didn't write
function parse(input) {     // ✗ noImplicitAny : 'input' a un type any implicite
  return input.trim();      // …et on est déjà dans le trou
}

const xs = [];              // any[] implicite tant qu'on ne pousse rien de typé
xs.push(fnQuiRendAny());    // le trou entre sans qu'on ait jamais écrit 'any'
any face à ses voisinsany against its neighbors
any
T → anyT → any✓ tout y monte✓ everything flows up
any → Tany → T✓ il redescend partout✓ it flows back down
Vérifie ?Checks?rien — la lumière est éteintenothing — lights off
unknown
T → unknownT → unknown✓ tout y monte✓ everything flows up
unknown → Tunknown → T✗ il faut prouver d'abord✗ must prove first
Vérifie ?Checks?oui — narrowing obligatoire (4.2)yes — narrowing required (4.2)
Les voisins, seulement nommés.The neighbors, only named.

D'où viennent les any implicites ? D'un paramètre non annoté, d'un [] vide, d'un accès indexé non typé, et historiquement du catch (e). Le drapeau noImplicitAny (inclus dans strict) en fait une erreur — c'est le premier à activer. unknown est le jumeau honnête d'any (4.2), et as any le trou qu'on creuse à la main (4.3).Where do implicit anys come from? An un-annotated parameter, an empty [], an untyped indexed access, and historically catch (e). The noImplicitAny flag (part of strict) turns it into an error — the first to enable. unknown is any's honest twin (4.2), and as any the hole you dig by hand (4.3).

№ 04Le piègeThe trap4 min

Le any qui « règle » l'erreur qu'on n'a pas pris le temps de lire.The any that "fixes" the error you didn't take the time to read.

Le piège n'est pas technique, il est de réflexe. Le compilateur souligne quelque chose qu'on ne comprend pas ; un as any, et le rouge disparaît. Mais cette erreur était un théorème : « cette valeur peut être absente », « ce champ n'existe pas ». La faire taire ne la rend pas fausse — on a juste supprimé l'énoncé, pas le bug. Et comme any déteint, on a rouvert le trou pour tout le code en aval.The trap isn't technical, it's reflexive. The compiler underlines something you don't understand; an as any, and the red disappears. But that error was a theorem: 'this value may be absent', 'this field doesn't exist'. Silencing it doesn't make it false — you only deleted the statement, not the bug. And since any bleeds, you reopened the hole for all the downstream code.

Un as any qui efface trois bugs d'un coupAn as any erasing three bugs at once
// L'erreur : "'response' is possibly 'undefined'." — on ne la lit pas, on l'écrase.
const value = (response as any).data.items[0].name;
//             ^ rouge éteint instantanément — et trois bugs avec lui :
//   response peut être null, data absent, items vide. Tout passe. 💥 au runtime

Le as any n'a pas répondu à la question du compilateur — il l'a censurée. Les trois risques qu'il signalait sont intacts, et la chaîne entière qui suit est désormais non vérifiée. On a échangé un avertissement précis contre un crash futur diffus.The as any didn't answer the compiler's question — it censored it. The three risks it flagged are intact, and the whole chain that follows is now unchecked. You traded a precise warning for a diffuse future crash.

Les rares any légitimes.The rare legitimate anys.

Il en existe : une migration JavaScript → TypeScript en cours, un point de contact avec une lib non typée, du code volontairement hétérogène qu'on rétrécit aussitôt. Mais même là, unknown est presque toujours le remplaçant honnête — il dit la même chose (« je ne connais pas le type ») sans éteindre la lumière pour le reste. Le vrai danger d'any : c'est la seule échappatoire silencieux sur le fait qu'on l'emploie.They exist: an in-progress JavaScript → TypeScript migration, a contact point with an untyped lib, deliberately heterogeneous code you narrow at once. But even there, unknown is almost always the honest replacement — it says the same thing ("I don't know the type") without turning off the lights for the rest. any's real danger: it's the only escape hatch silent about being used.

Une erreur du compilateur est un théorème sur ton code. any ne le réfute pas — il l'efface, et le bug qu'il énonçait t'attend, intact, à l'exécution.A compiler error is a theorem about your code. any doesn't refute it — it erases it, and the bug it stated awaits you, intact, at runtime.
№ 05Bilan & éditoWrap-up & editorial2 min

Le seul type qui ne prouve rien — et qui en plus déteint.The one type that proves nothing — and bleeds on top of it.

any n'est pas un type, c'est l'interrupteur off du vérificateur. Il ne déplace pas l'erreur, il la rend muette — et, parce qu'il est assignable dans les deux sens, il coule en aval et recontamine du code correct. La vraie nuisance n'est pas l'erreur masquée ; ce sont toutes celles qu'il laissera passer ailleurs. unknown et as sont les façons honnêtes de faire ce qu'any fait en cachette.any isn't a type, it's the checker's off switch. It doesn't move the error, it mutes it — and, being assignable both ways, it flows downstream and re-contaminates correct code. The real harm isn't the hidden error; it's all the ones it'll let through elsewhere. unknown and as are the honest ways of doing what any does in secret.

Tu veux…You want to…Le gesteThe moveCe que ça coûteWhat it costs
Désactiver la vérificationDisable the checkany — l'interrupteur off (presque jamais ce qu'on veut).any — the off switch (almost never what you want).Déteint sur toute la chaîne ; l'erreur revient au runtime.Bleeds down the whole chain; the error returns at runtime.
Manipuler une valeur de type inconnuHandle a value of unknown typeunknown, pas any — tu devras la prouver (4.2).unknown, not any — you'll have to prove it (4.2).Narrowing obligatoire avant tout usage.Narrowing required before any use.
Attraper les any implicitesCatch implicit anysnoImplicitAny (inclus dans strict).noImplicitAny (part of strict).Il faut typer ce que TypeScript ne peut pas inférer.You must type what TypeScript can't infer.
Ne PAS l'employerNOT use itFaire taire une erreur qu'on n'a pas comprise.Silence an error you didn't understand.On supprime le théorème, pas le bug qu'il énonçait.You delete the theorem, not the bug it stated.
Toutes les échappatoires affaiblissent une garantie. any est la seule à le faire sans le dire — et à le faire déborder sur le reste.Every escape hatch weakens a guarantee. any is the only one that does it silently — and lets it spill onto the rest.
Mot de l'éditeurFrom the editor

« Éteindre la lumière. »"Turning off the lights."

any est le unsafe de TypeScript, et comme tout unsafe, il ne corrige rien : il retire la garantie. La différence avec un cast localisé, c'est qu'il ne reste pas localisé. On le pose sur une valeur récalcitrante, soulagé de voir le rouge disparaître — et on ne voit pas qu'il vient de débrancher la vérification pour tout ce que cette valeur touchera ensuite. Le code en aval a toujours l'air typé ; il ne l'est plus. C'est le pire des mensonges : celui qui ne se signale pas. L'erreur qu'on a fait taire, elle, était vraie — un théorème sur le code, pas une chicane du compilateur.any is TypeScript's unsafe, and like any unsafe, it fixes nothing: it removes the guarantee. The difference from a localized cast is that it doesn't stay localized. You drop it on a stubborn value, relieved to see the red vanish — and you don't see that you just unplugged checking for everything that value will touch next. The downstream code still looks typed; it isn't. It's the worst kind of lie: the one that doesn't announce itself. The error you silenced was true — a theorem about the code, not a compiler quibble.

Le réflexe du volume tient en une question : est-ce que je connais ce type, ou est-ce que j'abandonne la vérification — et est-ce que je le sais ? any abandonne en silence. Le prochain numéro présente son jumeau honnête : unknown dit exactement la même chose — « je ne connais pas ce type » — mais refuse de te laisser t'en servir avant que tu l'aies prouvé. Même aveu d'ignorance ; à la place de l'interrupteur off, une porte fermée à clé.The volume's reflex is one question: do I know this type, or am I abandoning the check — and do I know it? any abandons it silently. The next issue introduces its honest twin: unknown says exactly the same thing — 'I don't know this type' — but refuses to let you use it until you've proven it. Same admission of ignorance; instead of the off switch, a locked door.