JSON Toolkit

Générer des types TypeScript depuis un Schema

L’essentiel : json-schema-to-typescript et quicktype émettent un .d.ts en une commande, mais c'est un brouillon : caractère facultatif, unions, additionalProperties et dates demandent une passe humaine.

Intermédiaire~4 min de lecturePublié le 2026-10-30Mis à jour le 2026-10-30
Générer des types TypeScript depuis JSON Schema

L'essentiel : générez avec json-schema-to-typescript ou quicktype, puis corrigez à la main caractère facultatif, unions, additionalProperties et dates ; gardez Schema comme source et les types comme sortie, imposé par une étape types:check en CI.

Une commande vous donne un fichier. Elle ne vous donne pas des types corrects.

La ligne unique

npx json-schema-to-typescript schema.json > src/types/order.d.ts

Il gère $ref, allOf, oneOf, anyOf, et convertit description en JSDoc. Pour la génération par lots avec une bannière et un style choisi, appelez son API Node depuis un petit build-types.mjs.

quicktype est l'alternative, et peut aussi inférer un schéma depuis un JSON d'exemple :

npx quicktype -s schema schema.json -o order.ts --lang typescript

Quatre choses à corriger après

Le caractère facultatif. Tout ce qui n'est pas dans required devient ?. Mais « toujours présent, peut être null » et « peut être absent » sont des contrats différents :

interface Order {
  remark?: string | null;   // may be missing
  status: string;
}

Si le backend envoie toujours remark: null, retirez le ? et cessez de faire garder undefined à chaque consommateur.

Les unions non discriminées. oneOf devient généralement A | B, que TypeScript ne peut pas rétrécir sans champ littéral. Ajoutez une propriété type fixe à chaque branche dans le Schema.

additionalProperties. Omis ou true produit parfois [k: string]: unknown, parfois any. Le premier est sûr, le second désactive silencieusement la vérification de type pour tout l'objet.

Les formats de date. format: "date-time" est une chaîne sur le fil. Le mapper sur Date signifie que vous devez aussi désérialiser, sinon la valeur à l'exécution reste une chaîne tandis que le type ment.

Gardez la direction fixe

Schema est la source, les types sont la sortie. Générer le Schema depuis des types écrits à la main n'est acceptable que si la régénération est obligatoire et imposée en CI — sinon les deux côtés dérivent et personne ne sait lequel fait autorité.

Mettez-le dans le pipeline

"types:gen": "json2ts -i schemas/ -o src/types/generated",
"types:check": "pnpm types:gen && git diff --exit-code src/types/generated"

types:check est la partie qui compte : changez le Schema sans régénérer et la CI échoue.

FAQ

Pourquoi le fichier généré contient-il any ?

Cela vient généralement de additionalProperties défini à true ou omis, que certains générateurs mappent sur [k: string]: any. Remplacez-le par unknown ou des champs explicites, car any désactive la vérification de type pour tout l'objet.

Comment corriger les champs facultatifs après génération ?

Tout ce qui est hors de required devient ?, mais « toujours présent, peut être null » diffère de « peut être absent ». Si le backend envoie toujours le champ, retirez le ?.

La CI doit-elle échouer quand Schema et types dérivent ?

Oui. Un script types:check qui régénère et lance git diff --exit-code fait échouer le build dès que le Schema change sans régénération.

Lectures complémentaires