Aller au contenu principal

Code généré par IA : ce que TypeScript peut vérifier

Des types stricts, des schémas runtime et une CI lisible par les agents pour vérifier le code produit avec l’IA.

Une boucle courte entre génération, typecheck, tests et review, avec une décision de merge qui reste humaine.

Code TypeScript affiché sur plusieurs écrans

Contexte et livrables de la mission

Situations fréquentes

  • Code généré plausible mais incorrect
  • Contrats implicites entre client et serveur
  • Données de LLM non validées au runtime

Ce que vous obtenez

  • Configuration TypeScript stricte
  • Schémas partagés et frontières runtime
  • Boucle CI exploitable par les agents

Préparer votre mission

Quand intervenir
L’équipe utilise déjà des agents de code, mais les PR demandent trop de reprises ou les contrôles du dépôt sont incomplets. Le point de départ est un changement représentatif.
Ce que nous examinons
La configuration stricte, les contrats existants, la validation des données externes et les commandes de vérification. Les tests et la revue restent nécessaires pour le comportement métier et les autorisations.
Le premier livrable
Une liste des contrôles manquants et une tâche pilote avec ses critères d’acceptation. L’équipe peut comparer le diff, les diagnostics et la correction avant de reprendre ce processus sur d’autres tâches.

Expertise · TypeScript et développement assisté par l’IA

Par Théo LubertMis à jour le 8 min de lecture

Tech Lead et développeur TypeScript/Next.js chez Byrds Consulting.

Un agent peut produire un diff plausible qui utilise une ancienne signature ou oublie un cas. TypeScript compare cette proposition aux contrats du dépôt et signale certaines erreurs avant la review.

Le contexte du dépôt

Donner à l’agent les signatures du projet

En août 2025, TypeScript est devenu le langage le plus utilisé sur GitHub selon le nombre de contributeurs mensuels. Cette mesure ne résume pas toute l’industrie, mais elle confirme une évolution déjà visible dans les équipes produit : le JavaScript typé fait désormais partie de l’outillage habituel.

TypeScript s’utilise pour le code navigateur, React et Next.js, les API Node.js, les workers et une grande partie de l’outillage. Une équipe peut ainsi travailler dans le même langage de l’interface au serveur. Ce confort s’arrête aux frontières d’exécution : une interface TypeScript ne vérifie pas à elle seule le JSON reçu depuis une API, une base de données ou un LLM.

Ce que l’agent peut lire et vérifier

Le bénéfice dépasse l’autocomplétion. Les types rendent une partie des attentes du projet lisible par les développeurs, l’éditeur et les agents de code.

  • Un écosystème largement documenté et déjà familier aux équipes web.
  • Des contrats explicites entre composants, services et bibliothèques.
  • Des diagnostics disponibles dans l’éditeur, en local et dans la CI.

Le développement avec un agent

Comparer le diff aux contrats déclarés

Un modèle génère du code plausible. Il peut inventer une propriété, oublier une branche d’une union ou utiliser l’ancienne signature d’une fonction. Le compilateur ne sait pas si la fonctionnalité est pertinente, mais il peut confronter le diff aux contrats présents dans le dépôt.

Les agents connaissent bien les API et les patterns courants de l’écosystème TypeScript. Cela accélère une première proposition, sans garantir qu’elle corresponde à la version installée ou aux conventions locales. Les diagnostics du type checker les ramènent alors au code qui existe réellement dans le projet.

Contexte proche de l’usage

Les signatures, génériques et types de retour précisent les formes attendues sans devoir les recopier intégralement dans le prompt.

Diagnostics exploitables

Le compilateur indique le fichier, la ligne et le contrat qui ne correspond plus. L’agent peut repartir de cette information précise.

Impact d’un refactor visible

La modification d’un type partagé fait remonter les appels à adapter, y compris dans des fichiers absents du premier diff.

Cas oubliés signalés

Un contrôle d’exhaustivité sur une union discriminée fait échouer le typecheck lorsqu’une variante déclarée n’est pas traitée.

Le type checker répond à une question limitée : ce code est-il compatible avec les contrats déclarés ? Il ne valide pas le besoin produit, mais sa réponse est rapide et reproductible.

La boucle de feedback

Générer un petit diff, vérifier, puis faire relire

Une tâche adaptée à un agent porte sur un objectif précis. Elle indique le comportement attendu, les fichiers concernés et les contraintes à préserver. Le premier diff peut alors être confronté aux commandes habituelles du dépôt plutôt qu’à une description abstraite du projet.

Les erreurs de tsc --noEmit donnent à l’agent une liste concrète de corrections. Une fois les vérifications automatiques passées, la review se concentre sur le reste : le comportement attendu, la lisibilité, les risques d’exploitation et la pertinence des tests.

Tâche cadrée

Un objectif, des critères d’acceptation et un périmètre explicite.

Diff TypeScript

L’agent suit les contrats et les conventions déjà présents dans le dépôt.

Vérifications du projet

Typecheck, lint, tests et build exposent les régressions détectables automatiquement.

Review humaine

Une personne relit le comportement, les compromis et les effets de bord avant le merge.

Le compilateur raccourcit la boucle de correction. La décision de merger reste à l’équipe.
Exemple illustratif : traiter tous les états déclarésTypeScript
type Job =
    | { status: 'queued' }
    | { status: 'done'; url: string }
    | { status: 'failed'; message: string }

function assertNever(value: never): never {
    throw new Error(`Unhandled job: ${JSON.stringify(value)}`)
}

function jobLabel(job: Job): string {
    switch (job.status) {
        case 'queued': return 'En attente'
        case 'done': return job.url
        case 'failed': return job.message
        default: return assertNever(job)
    }
}

Si le premier diff oublie la branche failed, l’appel à assertNever(job) ne compile plus : job peut encore contenir cet état. Le diagnostic donne à l’agent le cas à traiter. Une personne doit ensuite vérifier que le message affiché et le comportement de l’interface conviennent au produit. Ce contrôle suppose que les données reçues ont déjà été validées à l’exécution.

La frontière avec les données externes

Un diff typé doit encore vérifier ses entrées

Le même problème se pose lorsqu’un agent modifie une fonctionnalité qui appelle un modèle. Les données reçues depuis une API, une base ou un LLM doivent être validées à l’exécution. Les types seuls ne font pas ce contrôle.

Les bibliothèques utilisées pour ces fonctions ont leurs propres contrats. L’AI SDK de Vercel fournit des sorties structurées et des outils validés par schéma ; TanStack AI propose notamment des outils typés et du streaming. Les capacités dépendent des versions, des fournisseurs et des modèles. Le statut bêta de TanStack AI mentionné dans les sources compte aussi dans le choix et la maintenance.

  1. 01

    Valider les données externes

    Zod, Valibot ou JSON Schema peuvent refuser un appel mal formé. Les contrôles métier, comme vérifier qu’un utilisateur peut accéder à la ressource ou que la plage de dates est cohérente, restent explicites dans le service.
  2. 02

    Limiter le contrat de chaque outil

    Un outil avec peu de paramètres, des noms précis et un résultat documenté est plus simple à appeler, tester et faire évoluer qu’une fonction générique exposant tout un service.
  3. 03

    Relire le comportement obtenu

    Un diff qui compile peut encore choisir la mauvaise API, masquer une erreur ou ajouter une dépendance inutile. La review porte sur ces décisions, pas seulement sur la forme du code.

Un même schéma peut valider les arguments d’un outil et typer sa fonction execute lorsqu’il s’agit exactement du même contrat. Il ne faut pas pour autant fusionner les modèles d’API, de domaine et de stockage uniquement pour éviter quelques lignes de mapping.

Les limites utiles

Un typecheck vert ne suffit pas à valider une fonctionnalité

Avec le mode strict activé, le compilateur détecte une propriété absente, une valeur undefined non traitée ou une réponse incompatible. Il ne sait pas si une règle métier est juste, si un utilisateur est autorisé à agir ou si une requête renvoie les bonnes données. Ces points demandent des validations à l’exécution, des tests ciblés et une review attentive.

Ce que TypeScript apporte réellement

Un retour rapide sur une classe précise d’erreurs fréquentes dans les changements générés comme dans ceux écrits à la main.

  • Les incompatibilités entre signatures peuvent être détectées avant le déploiement.
  • Modifier un type fait apparaître les consommateurs qui doivent aussi être adaptés.
  • Les outils IA peuvent associer validation runtime et inférence statique à partir d’un schéma.
  • any, les assertions de type et les données non validées peuvent toujours contourner ces garanties.

Le contrôle qui reste à l’équipe

Une fois le typecheck passé, la review doit encore vérifier les règles métier, les autorisations et le comportement livré. Un compilateur ne peut pas décider si la fonctionnalité répond au besoin.

Sources et documentation

  1. Octoverse 2025: AI leads TypeScript to #1. GitHub. Données et méthodologie sur l’usage de TypeScript en 2025.
  2. TypeScript: JavaScript with syntax for types. TypeScript. Présentation officielle du langage, de son inférence et de son adoption progressive.
  3. TSConfig: strict et noEmit. TypeScript. Référence des contrôles stricts et du compilateur utilisé pour le typecheck.
  4. AI SDK Core: Tools and tool calling. Vercel AI SDK. Schémas d’entrée, validation des appels et inférence des paramètres.
  5. AI SDK introduction. Vercel AI SDK. Vue d’ensemble actuelle du toolkit TypeScript et des API Core et UI.
  6. TanStack AI overview. TanStack. Documentation du cœur typé, des outils et des adaptateurs.
  7. TanStack AI Beta. TanStack. Statut actuel du projet et implications de sa phase bêta.

Vérifions si ce format correspond à votre contexte

Un premier échange de 30 minutes permet d’examiner votre besoin et de définir la prochaine étape.

Organiser l’échange