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
- Collez un objet JSON ; incluez plusieurs éléments de tableau si certaines clés sont optionnelles.
- 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).
- 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.