J'écris tout en TypeScript. Frontend, backend, scripts, outils. Pas parce que c'est à la mode, mais parce que ça élimine des catégories entières de bugs que JavaScript laisse passer.
Un undefined is not a function en production à 3h du matin, c'est un problème que TypeScript résout à la compilation. Une propriété renommée qui casse 12 fichiers sans que personne ne le voie, TypeScript le signale immédiatement. Le typage n'est pas une contrainte, c'est un filet de sécurité.
Sur les projets que je construis, applications métier, SaaS, API, le coût d'un bug en production est élevé. TypeScript réduit ce risque drastiquement.
Détection d'erreurs à la compilation. Une propriété manquante, un type incompatible, un argument oublié. Le compilateur les détecte avant que le code ne tourne. En JavaScript, ces erreurs arrivent en production.
Refactoring en confiance. Renommer une interface, changer un type de retour, restructurer un module. Le compilateur montre chaque endroit impacté. En JavaScript, c'est un find-and-replace en espérant ne rien oublier.
Autocomplétion intelligente. L'éditeur connaît les types, les méthodes disponibles, les signatures de fonction. Le développement est plus rapide parce que l'IDE guide au lieu de deviner.
Documentation vivante. Les interfaces TypeScript décrivent les contrats entre les parties du code. Pas besoin de JSDoc ou de commentaires. Le type est la documentation.
Onboarding accéléré. Un nouveau développeur sur le projet comprend les structures de données en lisant les types. Pas besoin de tracer le code pour comprendre ce qu'une fonction attend ou retourne.
Strict mode activé. strict: true dans le tsconfig.json. Pas de any implicite, pas de null non géré, pas de undefined silencieux. Le mode strict est non-négociable.
Interfaces pour les contrats publics. Props de composants, DTOs d'API, retours de composables. Tout ce qui traverse une frontière de module est typé explicitement.
Inférence partout ailleurs. TypeScript infère les types des variables locales, des retours de fonction, des computed. Je ne type pas ce que le compilateur peut déduire seul.
Zod pour la validation runtime. Les types TypeScript disparaissent au runtime. Pour les données externes (API, formulaires, webhooks), Zod valide à l'exécution ET infère les types à la compilation. Un seul schéma pour les deux.
Générics quand c'est justifié. Les generics rendent le code réutilisable sans perdre le typage. Mais un generic inutile est pire que pas de generic. Je les utilise pour les composables, les services API et les utilitaires partagés.