Naar de inhoud

Converteer JSON naar io-ts-typen — Numio

Genereert io-ts-runtimecodecs uit een JSON-voorbeeld, voorafgegaan door import * as t uit "io-ts". Geneste objecten worden hun eigen codecs, gedeclareerd vóór de codecs die ze gebruiken; sleutels die bij sommige array-items ontbreken, gaan naar t.partial.

Valideren van een API-antwoord tijdens runtime in een TypeScript-app gebouwd op fp-ts en io-ts.

JSON

IO TS

Wanneer gebruik je dit?

  • Valideren van een API-antwoord tijdens runtime in een TypeScript-app gebouwd op fp-ts en io-ts.
  • Codecs opstellen voor een JSON-configuratiebestand dat vóór gebruik moet worden gecontroleerd.

Hoe werkt het

  1. Plak een JSON-object; meerdere array-items opnemen als sommige sleutels optioneel zijn.
  2. Lees de gegenereerde codecs: de root is RootInterface en geneste codecs zijn vernoemd naar hun sleutels (instellingen worden Instellingen).
  3. Kopieer de code, exporteer de codecs die je nodig hebt en leid typen af met t.TypeOf.

JSON-ingang

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

io-ts-codecs

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),
})

Details en beperkingen

Gegenereerd in de browser door de eigen generator van de site en geformatteerd met Prettier; de pagina heeft geen instellingen en doet geen serververzoek.

Codecs worden eerst afhankelijkheden verzonden, dus elke const wordt gedefinieerd voordat RootInterface ernaar verwijst.

Getallen worden t.getal (zowel gehele getallen als decimalen). null geeft t.null, of t.union([X, t.null]) wanneer andere samples een waarde hebben; lege arrays geven t.array(t.unknown).

Sleutels die ontbreken in sommige items van een array gaan naar t.partial, gecombineerd met de vereiste sleutels via t.intersection.

FAQ

Creëert het ook TypeScript-typen?

Niet direct. Voeg type Root = t.TypeOf<typeof RootInterface> toe om het statische type van elke codec af te leiden.

Hoe worden optionele velden of null-velden verwerkt?

Een sleutel die in sommige array-items ontbreekt, wordt in t.partial geplaatst; een sleutel die in sommige items null is, wordt t.union([type, t.null]). Sleutels op het hoogste niveau van een enkel object zijn altijd vereist.

Wat gebeurt er met een JSON-array in de root?

De items worden samengevoegd in één RootInterface-codec voor de itemvorm, en const RootInterfaceList = t.array(RootInterface) wordt toegevoegd voor de hele array.

Specificaties en referenties