Aller au contenu

Convertir JSON en types io-ts — Numio

Génère des codecs d’exécution io-ts à partir d’un échantillon JSON, précédés de import * as t from "io-ts". Les objets imbriqués deviennent leurs propres codecs, déclarés avant les codecs qui les utilisent ; les clés absentes de certains éléments d’un tableau vont dans t.partial.

Valider à l’exécution une réponse d’API dans une app TypeScript construite sur fp-ts et io-ts.

JSON

IO TS

Quand l’utiliser

  • Valider à l’exécution une réponse d’API dans une app TypeScript construite sur fp-ts et io-ts.
  • Ébaucher des codecs pour un fichier de configuration JSON qui doit être vérifié avant utilisation.

Mode d’emploi

  1. Collez un objet JSON ; incluez plusieurs éléments de tableau si certaines clés sont optionnelles.
  2. Lisez les codecs générés : la racine est RootInterface et les codecs imbriqués prennent le nom de leur clé (settings devient Settings).
  3. Copiez le code, exportez les codecs dont vous avez besoin et dérivez les types avec t.TypeOf.

Entrée JSON

{
  "id": "u_1",
  "name": "Ada",
  "age": 36,
  "nickname": null,
  "settings": { "theme": "dark", "fontSize": 14 },
  "posts": [
    { "title": "Notes", "draft": true },
    { "title": "Engine" }
  ]
}

Codecs io-ts

import * as t from "io-ts"

const Settings = t.type({
  theme: t.string,
  fontSize: t.number,
})

const Posts = t.intersection([
  t.type({
    title: t.string,
  }),
  t.partial({
    draft: t.boolean,
  }),
])

const RootInterface = t.type({
  id: t.string,
  name: t.string,
  age: t.number,
  nickname: t.null,
  settings: Settings,
  posts: t.array(Posts),
})

Détails et limites

Généré dans le navigateur par le générateur propre au site et formaté avec Prettier ; la page n’a pas de paramètres et n’envoie aucune requête au serveur.

Les codecs sont émis dépendances d’abord : chaque const est donc définie avant que RootInterface y fasse référence.

Les nombres deviennent t.number (entiers comme décimaux). null donne t.null, ou t.union([X, t.null]) quand d’autres échantillons ont une valeur ; les tableaux vides donnent t.array(t.unknown).

Les clés absentes de certains éléments d’un tableau vont dans t.partial, combiné aux clés obligatoires via t.intersection.

FAQ

Crée-t-il aussi des types TypeScript ?

Pas directement. Ajoutez type Root = t.TypeOf<typeof RootInterface> pour dériver le type statique de chaque codec.

Comment les champs optionnels ou nullables sont-ils gérés ?

Une clé absente de certains éléments d’un tableau est placée dans t.partial ; une clé null dans certains éléments devient t.union([type, t.null]). Les clés de premier niveau d’un objet unique sont toujours obligatoires.

Que se passe-t-il avec un tableau JSON à la racine ?

Les éléments sont fusionnés en un seul codec RootInterface décrivant la forme d’un élément, et const RootInterfaceList = t.array(RootInterface) est ajouté pour le tableau entier.

Spécifications et références