Zum Inhalt springen

JSON in io-ts-Typen umwandeln — Numio

Erzeugt io-ts-Laufzeit-Codecs aus einem JSON-Beispiel, eingeleitet von import * as t from "io-ts". Verschachtelte Objekte werden zu eigenen Codecs, die vor den Codecs deklariert werden, die sie verwenden; Schlüssel, die in einigen Array-Elementen fehlen, kommen in t.partial.

Eine API-Antwort zur Laufzeit in einer TypeScript-App auf Basis von fp-ts und io-ts validieren.

JSON

IO TS

Wann sie hilft

  • Eine API-Antwort zur Laufzeit in einer TypeScript-App auf Basis von fp-ts und io-ts validieren.
  • Codecs für eine JSON-Konfigurationsdatei entwerfen, die vor der Verwendung geprüft werden muss.

Anwendung

  1. Füge ein JSON-Objekt ein; nimm mehrere Array-Elemente auf, wenn einige Schlüssel optional sind.
  2. Lies die erzeugten Codecs: Die Root heißt RootInterface, verschachtelte werden nach ihren Schlüsseln benannt (settings wird zu Settings).
  3. Kopiere den Code, exportiere die benötigten Codecs und leite Typen mit t.TypeOf ab.

JSON-Eingabe

{
  "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 und Einschränkungen

Wird im Browser vom eigenen Generator der Seite erzeugt und mit Prettier formatiert; die Seite hat keine Einstellungen und stellt keine Serveranfrage.

Codecs werden mit den Abhängigkeiten zuerst ausgegeben, sodass jede const definiert ist, bevor RootInterface sie referenziert.

Zahlen werden zu t.number (ganze und Dezimalzahlen gleichermaßen). null ergibt t.null, oder t.union([X, t.null]), wenn andere Beispiele einen Wert haben; leere Arrays ergeben t.array(t.unknown).

Schlüssel, die in einigen Elementen eines Arrays fehlen, kommen in t.partial und werden über t.intersection mit den Pflichtschlüsseln kombiniert.

FAQ

Erzeugt es auch TypeScript-Typen?

Nicht direkt. Füge type Root = t.TypeOf<typeof RootInterface> hinzu, um den statischen Typ aus jedem Codec abzuleiten.

Wie werden optionale oder nullable Felder behandelt?

Ein Schlüssel, der in einigen Array-Elementen fehlt, kommt in t.partial; ein Schlüssel, der in einigen Elementen null ist, wird zu t.union([type, t.null]). Schlüssel auf oberster Ebene eines einzelnen Objekts sind immer Pflicht.

Was passiert mit einem JSON-Array auf oberster Ebene?

Die Elemente werden zu einem RootInterface-Codec für die Elementform zusammengeführt, und const RootInterfaceList = t.array(RootInterface) wird für das gesamte Array ergänzt.

Spezifikationen und Referenzen