Przejdź do treści

Konwerter JSON Schema na definicje TypeScript — Numio

Kompiluje JSON Schema do interfejsów TypeScript przy użyciu json-schema-to-typescript. Właściwości niewymienione w "required" stają się opcjonalne, a obiekty otrzymują sygnaturę indeksową, chyba że additionalProperties ma wartość false.

Twój API publikuje pliki schematu JSON i chcesz dopasować interfejsy do kodu klienta, który je wykorzystuje.

JSON Schema

TypeScript

Kiedy go używać

  • Twój API publikuje pliki schematu JSON i chcesz dopasować interfejsy do kodu klienta, który je wykorzystuje.
  • Sprawdzasz poprawność plików konfiguracyjnych według schematu i chcesz sprawdzić typ, gdzie ładowana jest konfiguracja.

Jak używać

  1. Wklej JSON Schema do panelu schematu. "title" ustawia nazwę interfejsu; bez niego główny typ nosi nazwę MySchema.
  2. Konwersja przebiega w przeglądarce podczas pisania; strona nie ma żadnych ustawień i nie dodaje komentarza do banera.
  3. Skopiuj interfejsy z panelu TypeScript. Strona formatuje je w formacie Prettier, więc używają wcięcia z dwiema spacjami i nie używają średników.

Schemat JSON

{
  "title": "Address",
  "type": "object",
  "properties": {
    "street": { "type": "string", "minLength": 1 },
    "zip": { "type": "string", "pattern": "^[0-9]{5}$" },
    "country": { "enum": ["US", "CA"], "default": "US" },
    "unit": { "type": ["integer", "null"] },
    "lines": { "type": "array", "items": { "type": "string" }, "maxItems": 3 },
    "geo": { "type": "object", "required": ["lat", "lng"],
      "properties": { "lat": { "type": "number" }, "lng": { "type": "number" } } }
  },
  "required": ["street", "zip"]
}

Interfejsy TypeScript

export interface Address {
  street: string
  zip: string
  country?: "US" | "CA"
  unit?: number | null
  lines?: [] | [string] | [string, string] | [string, string, string]
  geo?: {
    lat: number
    lng: number
    [k: string]: unknown
  }
  [k: string]: unknown
}

Szczegóły i ograniczenia

Obiekty bez „additionalProperties”: false get [k: string]: nieznane, więc dodatkowe klucze pozostają dozwolone w typie.

maxItems tablicy jest rozwijane do unii krotek, jak w przypadku "lines" w przykładzie.

Lokalne wpisy $ref, takie jak #/definitions/Tag, stają się oddzielnymi eksportowanymi interfejsami.

Strona wyświetla wynik poprzez Prettier bez średników, co powoduje również usunięcie zbędnych nawiasów wokół związków, takich jak „US” | „CA”.

FAQ

Jak wpisuje się wartości null?

"type": ["integer", "null"] staje się (number | null). Zarówno integer, jak i number są mapowane na number.

Jak pozbyć się [k: string]: nieznany?

Dodaj „additionalProperties”: false do każdego schematu obiektu; podpis indeksu jest wówczas pomijany.

Jak nazywa się interfejs główny?

Z "title" schematu przekształconego do PascalCase ("Example Schema" staje się ExampleSchema). Bez title nazwa to MySchema.

Czy schemat jest wysyłany na serwer?

Nie. Na tej stronie w przeglądarce działa funkcja kompilacji json-schema-to-Typescript.

Specyfikacje i referencje