100 % local — vos données ne quittent jamais votre navigateur

JSON en TypeScript — fini les interfaces à la main

Transformez un échantillon JSON en interfaces TypeScript. Les objets imbriqués reçoivent leur propre type nommé : un payload devient un fichier à coller.

Instantané Privé Zéro cookie
Style

Entrée JSON

Sortie TypeScript

Ce que fait cet outil

Un échantillon JSON devient des types TypeScript, une interface nommée par objet.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
export interface Root {
  id: number;
  name: string;
  address: Address;
}

export interface Address {
  city: string;
}

interface ou type, exporté ou non, et le nom de la racine : à vous de régler.

Une liste à la racine a enfin un nom

Un tableau d’objets est l’échantillon le plus courant qui soit : c’est ce que rend un point d’entrée de liste. La sortie ne donnait que l’interface de l’élément :

export interface UsersItem {
  id: number;
}

et le nom racine que vous aviez saisi n’allait nulle part. La liste elle-même est maintenant nommée :

export type Users = UsersItem[];

export interface UsersItem {
  id: number;
}

C’était un défaut, trouvé en écrivant cette page puis corrigé. Les générateurs Zod et io-ts de ce site émettaient déjà leur racine ; TypeScript, non.

Même nom, forme différente

Les noms de types viennent des clés : deux branches peuvent vouloir Address toutes les deux. Quand les formes diffèrent, la seconde devient Address2 au lieu d’être fondue dans un type qui ne convient à aucune. Quand les formes sont identiques, une seule définition est partagée — un Address référencé deux fois.

Ce qu’un échantillon ne peut pas dire

Rien n’est marqué optionnel, et c’est délibéré : une clé vue une fois dit qu’elle peut apparaître, pas qu’elle apparaît toujours. "nickname": null donne nickname: null, parce que c’est tout ce que contient l’échantillon — élargissez-le vous-même en string | null quand vous le saurez.

Un identifiant de vingt chiffres est typé number, et un nombre JavaScript ne le contient pas : au-delà de 2^53, la valeur change à l’analyse. Le type ne ment pas sur l’échantillon, il hérite d’une limite du langage — si le champ est un identifiant flocon, mettez-le en string et tenez-le hors de JSON.parse.

Une clé répétée est refusée

{"a": 1, "a": "x"} rendait a: string, la dernière occurrence l’emportant en silence. Deux valeurs, une clé, aucun moyen de dire quel type porte le champ : la conversion s’arrête maintenant et déclare le document ambigu. C’est déjà la réponse que le validateur JSON d’ici donnait au même document.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi aucun champ n’est-il optionnel ?
Parce qu’un document ne peut pas le dire. Une clé présente prouve qu’elle peut l’être, pas qu’elle l’est toujours. Tout marquer obligatoire est au moins une affirmation vérifiable sur un second échantillon ; inventer un `?` serait une affirmation sur des données que vous n’avez jamais montrées.
Ma liste d’utilisateurs n’a produit que `UsersItem`. Où est le type de la liste ?
Il est là désormais. Un tableau à la racine ne rendait que l’interface de l’élément : il fallait écrire `UsersItem[]` soi-même, et le nom racine demandé était ignoré en silence. La sortie commence maintenant par `export type Users = UsersItem[];`. C’était un vrai défaut, trouvé en écrivant cette page.
Deux objets différents s’appellent tous deux `Address`. Que se passe-t-il ?
Le second devient `Address2`. Les noms viennent des clés, et deux clés de branches différentes peuvent porter le même nom avec des formes différentes. Les fusionner donnerait un type faux pour les deux ; suffixer garde chacun honnête, et des formes identiques partagent toujours une seule définition.

Convertisseurs associés