100 % local: tus datos nunca salen de tu navegador

JSON a io-ts — decodifica y obtén el tipo

Convierte una muestra JSON en códecs io-ts. Un códec por objeto, declarado antes de usarse, y TypeOf te devuelve el tipo estático desde esa declaración.

Instantáneo Privado Cero cookies

Entrada JSON

Salida io-ts

Qué hace esta herramienta

Una muestra JSON pasa a ser códecs de io-ts, un const por objeto.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import * as t from "io-ts";

export const Address = t.type({
  city: t.string,
});

export const Root = t.type({
  id: t.Int,
  name: t.string,
  address: Address,
});

Los hijos se declaran primero: los códecs son valores de ejecución, uno debe existir antes de que otro lo mencione. Un array en la raíz recibe su propio códec —export const Users = t.array(UsersItem);— en vez de dejarte escribirlo.

t.Int es un tipo marcado, y se nota

t.Int es un refinamiento de t.number que lleva una prueba de integridad. t.TypeOf<typeof Root> da entonces { id: Int; … }, no { id: number; … }. Un Int va donde se espera un number; al revés hace falta un decode. Si ese roce no compensa el control de entero en tu base, t.number es un reemplazo de una palabra.

Cuál de los dos obtienes depende de cómo se escribió el número: 3 da t.Int, 10.0 da t.number. Hasta hace poco 10.0 también daba t.Int, y el códec rechazaba entonces 10.5, el registro siguiente. Era un defecto real, encontrado al escribir estas páginas y corregido.

Lo que un códec deja pasar

t.type comprueba lo que conoce e ignora el resto. Una respuesta con tres campos de más se decodifica limpiamente. Es la semántica de interfaz de io-ts, y es el buen valor por defecto para leer la API de otro; pero si una clave inesperada debe ser un error, envuelve la misma forma en t.strict, o en t.exact para quitarla.

Decodificar, en una línea

import { isRight } from "fp-ts/Either";

const result = Root.decode(payload);
if (isRight(result)) { /* result.right está tipado */ }

PathReporter.report(result) convierte un fallo en rutas legibles: viene bien la primera vez que un códec rechaza una carga que creías correcta.

Todo es obligatorio

Cada clave de la muestra aterriza en t.type, es decir, obligatoria. io-ts escribe la opcionalidad en un t.partial aparte, unido con t.intersection. Repartir tus claves entre las dos mitades es una afirmación sobre la API; un documento no puede hacerla por ti.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿`t.type` rechaza las propiedades de más?
No. `t.type` valida las propiedades que conoce y deja pasar el resto: es lo que io-ts llama un códec de interfaz. `t.exact` quita los sobrantes, `t.strict` los rechaza. El generador emite `t.type` porque una muestra no puede decir cuál de los tres quieres: es una decisión sobre tu API.
¿Por qué `t.TypeOf` me da `Int` y no `number`?
`t.Int` es un tipo marcado: un `Int` es un `number` que lleva una prueba de que se validó como entero. Asignar un `Int` a un `number` funciona; al revés hace falta un decode. Si prefieres números llanos en todas partes, sustituye `t.Int` por `t.number` y renuncia al control de entero.
¿Todos los campos son obligatorios?
Sí, y es lo que una sola muestra permite afirmar. io-ts escribe la opcionalidad con `t.partial`, normalmente combinado en `t.intersection([t.type({…}), t.partial({…})])`. Repartir las claves entre las dos mitades supone conocer la API, no leer un documento: el generador te deja la intersección.

Convertidores relacionados