Nous écrivons 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 nous construisons, 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. Nous ne typons 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. Nous les réservons aux composables, aux services API et aux utilitaires partagés.
Le typage strict n'a de valeur que sur la durée. Voici où il travaille pour nous.
Kabineo et Belho Xper. Deux SaaS multi-tenant pour cabinets comptables, où une erreur de type sur un calcul fiscal ne se rattrape pas. NestJS et Prisma côté serveur, Vue 3 côté client, TypeScript de bout en bout. Quand le moteur de règles fiscales a dû passer d'un cabinet unique à une configuration par structure, le compilateur a servi de plan de refactoring : il a listé chaque point d'impact au lieu de nous laisser les découvrir en production.
Fideneo. Gestion de clients, ventes, stocks, agenda et paiements Stripe dans une même application. Les contrats d'API typés entre le backend NestJS et le frontend Nuxt évitent la dérive silencieuse entre les deux, celle qui casse un formulaire trois semaines après un renommage.
Vijile. Application desktop dont le moteur de détection est en Rust et l'interface en Vue 3. Aux frontières entre les deux mondes, les types sont le seul contrat qui tienne.
Nous avons aussi documenté publiquement notre méthode de synchronisation des types entre backend et frontend via OpenAPI, dans un article dédié que vous trouverez ci-dessous.