Des noms de type fabriqués à partir de chaînes — et qui suivent leur source.Type names built from strings — and tracking their source.
Dernière marche du langage des types : composer des types à partir de chaînes. Un ensemble d'événements (click, focus, blur) appelle un ensemble de handlers (onClick, onFocus, onBlur) — deux listes qui doivent rester en phase. Réécrites à la main, elles divergent au premier ajout. Le template literal type les dérive : on prend les clés, on les capitalise, on les préfixe — et les handlers se recalculent à chaque changement de la source.The top step of the type language: composing types from strings. A set of events (click, focus, blur) calls for a set of handlers (onClick, onFocus, onBlur) — two lists that must stay in sync. Hand-written, they diverge on the first addition. The template literal type derives them: take the keys, capitalize, prefix — and the handlers recompute on every source change.
type Events = { click: MouseEvent; focus: FocusEvent; blur: FocusEvent }; // les props handlers, réécrites à la main — un event ajouté, un handler oublié : type Handlers = { onClick: (e: MouseEvent) => void; onFocus: (e: FocusEvent) => void; // onBlur manquant — et rien ne le signale };
Un nom de propriété peut désormais être un calcul : on + clé capitalisée. Le template literal type fait ce que ni le mapped ni le conditionnel ne savaient — fabriquer la chaîne elle-même, et la garder en phase avec sa source.A property name can now be a computation: on + capitalized key. The template literal type does what neither the mapped nor the conditional could — build the string itself, and keep it in sync with its source.
type Events = { click: MouseEvent; focus: FocusEvent; blur: FocusEvent }; type Handlers = { [K in keyof Events as `on${Capitalize<K & string>}`]: (e: Events[K]) => void; }; // ≡ { onClick; onFocus; onBlur } — CALCULÉ depuis Events, jamais désynchronisé
« Ce type calculé me fait-il gagner une garantie de synchro réelle — ou est-ce que je me prouve juste que je sais le faire ? » C'est le réflexe de tout le volume, et il atteint ici son point le plus tranchant : la puissance est maximale, donc la tentation aussi."Does this computed type buy me a real sync guarantee — or am I just proving I can do it?" It's the whole volume's reflex, and here it reaches its sharpest point: the power is maximal, so is the temptation.
C'est la synthèse — mapped (6.1) + conditionnel et infer (6.2) + chaînes — et le frein. Le template literal type est le sommet du langage des types ; ce numéro est donc le plus prudent du volume. On y montre tout ce qu'on peut faire, puis on insiste sur ce qu'il ne faut pas : savoir s'arrêter.It's the synthesis — mapped (6.1) + conditional and infer (6.2) + strings — and the brake. The template literal type is the type language's summit; so this issue is the volume's most cautious. We show everything you can do, then stress what you shouldn't: knowing when to stop.