Valider puis caster rouvre le trou. Parser le ferme en un seul geste.Validate then cast reopens the hole. Parsing shuts it in one move.
Le numéro précédent a posé le diagnostic : au bord, la donnée est unknown. Reste à la rendre typée honnêtement. Le réflexe courant — valider — vérifie un booléen, puis caste en as vers le type attendu. Deux gestes, deux trous : le check et le type dérivent (le guard menteur du 2.3), et le as est une promesse non vérifiée (4.3). Parser fait l'inverse : une fonction qui prend unknown et rend une valeur typée prouvée, ou échoue. La donnée n'est jamais castée — elle est transformée.The previous issue gave the diagnosis: at the edge, data is unknown. What remains is to make it honestly typed. The common reflex — validate — checks a boolean, then casts with as to the expected type. Two moves, two holes: the check and the type drift (the lying guard of 2.3), and the as is an unchecked promise (4.3). Parsing does the opposite: a function that takes unknown and returns a proven typed value, or fails. The data is never cast — it's transformed.
function isUser(x: unknown): boolean { // valide : rend un boolean return typeof x === "object" && x !== null && "name" in x; } if (isUser(data)) { const user = data as User; // ✗ on a vérifié 'name', on caste vers User ENTIER user.email.trim(); // 💥 email jamais vérifié — le 'as' a comblé l'écart }
Valider rend un boolean — et l'on caste ensuite, sur la foi de ce booléen, vers un type qu'il n'a pas entièrement vérifié. Parser retourne le type : si la donnée passe, on tient un User réel ; sinon, ça lève sur place.Validating returns a boolean — and you then cast, on the strength of that boolean, to a type it didn't fully check. Parsing returns the type: if the data passes, you hold a real User; otherwise, it throws on the spot.
const User = z.object({ name: z.string(), email: z.string() }); const user = User.parse(data); // ✓ valide ET produit un User — ou lève ICI, au bord user.email.trim(); // user : z.infer<typeof User> — prouvé, zéro 'as'
« À la frontière, je parse — je transforme une donnée inconnue en une donnée typée prouvée — je ne valide pas. » Vérifier puis caster en as, c'est rouvrir le trou ; parser le ferme, parce que le type sort de la vérification elle-même."At the boundary, I parse — I turn unknown data into proven typed data — I don't validate." Checking then casting with as reopens the hole; parsing shuts it, because the type comes out of the verification itself.
Tout converge ici. Le type ne vérifie pas la donnée (Vol 2) ; any et as ne font que masquer (Vol 4) ; la frontière ment (7.1). « Parse, don't validate » est la discipline qui répond à tout cela en un geste — et c'est le réflexe que le développeur emportera le plus souvent dans son travail quotidien.Everything converges here. The type doesn't check the data (Vol 2); any and as only mask (Vol 4); the boundary lies (7.1). 'Parse, don't validate' is the discipline that answers all of it in one move — and it's the reflex the developer will carry most often into daily work.