Convertir JSON a tipos de io-ts — Numio
Genera codecs de runtime de io-ts a partir de una muestra JSON, precedidos de import * as t from "io-ts". Los objetos anidados pasan a codecs propios, declarados antes de los codecs que los usan; las claves que faltan en algunos elementos de un array van a t.partial.
Validar en runtime la respuesta de una API en una app TypeScript basada en fp-ts e io-ts.
JSON
IO TS
Cuándo usarla
- Validar en runtime la respuesta de una API en una app TypeScript basada en fp-ts e io-ts.
- Esbozar codecs para un archivo de configuración JSON que debe comprobarse antes de usarse.
Cómo usarla
- Pega un objeto JSON; incluye varios elementos de array si algunas claves son opcionales.
- Revisa los codecs generados: la raíz es RootInterface y los anidados toman el nombre de su clave (settings pasa a Settings).
- Copia el código, exporta los codecs que necesites y deriva los tipos con t.TypeOf.
Entrada JSON
{
"id": "u_1",
"name": "Ada",
"age": 36,
"nickname": null,
"settings": { "theme": "dark", "fontSize": 14 },
"posts": [
{ "title": "Notes", "draft": true },
{ "title": "Engine" }
]
}Codecs de 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),
})Detalles y limitaciones
Lo genera en el navegador el generador propio del sitio y se formatea con Prettier; la página no tiene configuración ni hace peticiones al servidor.
Los codecs se emiten con las dependencias primero, así que cada const está definida antes de que RootInterface la referencie.
Los números pasan a t.number (tanto enteros como decimales). null da t.null, o t.union([X, t.null]) cuando otras muestras tienen un valor; los arrays vacíos dan t.array(t.unknown).
Las claves que faltan en algunos elementos de un array van a t.partial, combinado con las claves obligatorias mediante t.intersection.
FAQ
¿También crea tipos de TypeScript?
No directamente. Añade type Root = t.TypeOf<typeof RootInterface> para derivar el tipo estático de cada codec.
¿Cómo se tratan los campos opcionales o anulables?
Una clave que falta en algunos elementos de un array se coloca en t.partial; una clave que es null en algunos elementos pasa a t.union([type, t.null]). Las claves de nivel superior de un único objeto son siempre obligatorias.
¿Qué pasa con un array JSON en la raíz?
Los elementos se fusionan en un único codec RootInterface con la forma de cada elemento, y se añade const RootInterfaceList = t.array(RootInterface) para el array completo.