Le mapped type transforme chaque clé pareil. Pour décider, il faut brancher.The mapped type transforms every key alike. To decide, you must branch.
Le numéro précédent réécrivait une forme uniformément. Mais certains types dépendent d'une décision : « garde ce membre, jette celui-là », « si c'est une Promise, déballe-la, sinon laisse ». Une boucle ne sait pas trancher. Le type conditionnel le fait : T extends U ? X : Y choisit X ou Y selon que T est assignable à U. C'est un if au niveau type — et il rend calculable ce qu'on réécrivait à la main, cas par cas.The previous issue rewrote a shape uniformly. But some types depend on a decision: 'keep this member, drop that one', 'if it's a Promise, unwrap it, else leave it'. A loop can't decide. The conditional type can: T extends U ? X : Y picks X or Y depending on whether T is assignable to U. It's an if at the type level — and it makes computable what you used to rewrite by hand, case by case.
type Maybe = string | number | null | undefined; // réécrit à la main — oublie un membre dès que Maybe change : type Defined = string | number; // Ajoute 'boolean' à Maybe → Defined l'ignore, et ment.
Réécrire les cas à la main, c'est figer une décision qui devrait suivre la source. T extends U ? X : Y exprime la règle — « garde si…, jette sinon » — et la rejoue à chaque fois que le type d'entrée change.Hand-rewriting the cases freezes a decision that should track the source. T extends U ? X : Y states the rule — "keep if…, drop otherwise" — and replays it every time the input type changes.
type Maybe = string | number | null | undefined; type Defined = NonNullable<Maybe>; // string | number — CALCULÉ par branchement // NonNullable<T> = T extends null | undefined ? never : T
« Ce type dépend-il d'une décision sur un autre type ? » Si oui — garder ou jeter, déballer ou non, telle forme ou telle autre —, c'est un extends ? :, pas une liste de cas figée à la main."Does this type depend on a decision about another type?" If so — keep or drop, unwrap or not, this shape or that — it's an extends ? :, not a hand-frozen list of cases.
Le mapped type était la boucle ; le conditionnel est le if. Avec lui, le langage des types gagne de quoi brancher — et, via infer (chapitre 3), de quoi extraire un type capturé. ReturnType, Awaited, Exclude : toute une famille en découle. Et le même extends qu'au Vol 5, mais cette fois comme test, pas comme borne.The mapped type was the loop; the conditional is the if. With it, the type language gains the means to branch — and, via infer (chapter 3), to extract a captured type. ReturnType, Awaited, Exclude: a whole family follows. And the same extends as in Vol 5, but this time as a test, not a bound.