Converter JSON em tipos io-ts — Numio
Gera codecs de runtime io-ts a partir de uma amostra JSON, precedidos de import * as t from "io-ts". Objetos aninhados viram codecs próprios, declarados antes dos codecs que os usam; chaves ausentes em alguns itens de um array vão para t.partial.
Validar em runtime a resposta de uma API em um app TypeScript construído com fp-ts e io-ts.
JSON
IO TS
Quando usar
- Validar em runtime a resposta de uma API em um app TypeScript construído com fp-ts e io-ts.
- Rascunhar codecs para um arquivo de configuração JSON que precisa ser verificado antes do uso.
Como usar
- Cole um objeto JSON; inclua vários itens de array se algumas chaves forem opcionais.
- Confira os codecs gerados: a raiz é RootInterface e os aninhados recebem o nome da chave (settings vira Settings).
- Copie o código, exporte os codecs de que precisar e derive os tipos com 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 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),
})Detalhes e limitações
Gerado no navegador pelo gerador próprio do site e formatado com Prettier; a página não tem configurações e não faz requisições ao servidor.
Os codecs são emitidos com as dependências primeiro, então cada const está definida antes de RootInterface referenciá-la.
Números viram t.number (inteiros e decimais). null gera t.null, ou t.union([X, t.null]) quando outras amostras têm um valor; arrays vazios geram t.array(t.unknown).
Chaves ausentes em alguns itens de um array vão para t.partial, combinado com as chaves obrigatórias por meio de t.intersection.
FAQ
Ele também cria tipos TypeScript?
Não diretamente. Adicione type Root = t.TypeOf<typeof RootInterface> para derivar o tipo estático de cada codec.
Como campos opcionais ou anuláveis são tratados?
Uma chave ausente em alguns itens de um array é colocada em t.partial; uma chave que é null em alguns itens vira t.union([type, t.null]). Chaves de nível superior de um único objeto são sempre obrigatórias.
O que acontece com um array JSON na raiz?
Os itens são mesclados em um único codec RootInterface com o formato do item, e const RootInterfaceList = t.array(RootInterface) é adicionado para o array inteiro.