Naar de inhoud

TypeScript naar JSON-schema — Numio

Genereert een concept-07 JSON-schema van TypeScript-typen met ts-json-schema-generator. Elk type valt onder "definities"; optionele eigenschappen worden weggelaten uit "vereist" en objecten krijgen "additionalProperties": false.

Uw verzoek- en antwoordtypen zijn TypeScript-interfaces en u hebt een JSON-schema nodig voor Ajv-validatie of een API-gateway.

TypeScript

JSON Schema

Wanneer gebruik je dit?

  • Uw verzoek- en antwoordtypen zijn TypeScript-interfaces en u hebt een JSON-schema nodig voor Ajv-validatie of een API-gateway.
  • U wilt een schema publiceren voor een JSON-configuratiebestand waarvan de vorm al is gedefinieerd als een TypeScript-type.

Hoe werkt het

  1. Plak TypeScript-interfaces of typ aliassen. JSDoc-tags zoals @minimum, @format of @pattern worden in het schema ingelezen.
  2. De broncode wordt lokaal in je browser naar JSON Schema omgezet, waarbij alle typen beschikbaar worden gemaakt.
  3. Kopieer het JSON-schema. Als de invoer slechts één type heeft, krijgt de root er ook een $ref aan.

TypeScript

/** A product in the catalog */
export interface Product {
  /** @minimum 0 */
  price: number;
  name: string;
  tags?: string[];
}

JSON-schema (concept-07)

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "#/definitions/Product",
  "definitions": {
    "Product": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "minimum": 0
        },
        "name": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "price",
        "name"
…

Details en beperkingen

De conversie vindt lokaal plaats in een Web Worker in je browser. Je invoer wordt niet naar een conversieserver verstuurd. De benodigde bibliotheken worden in de browser geladen.

JSDoc wordt geparseerd in de uitgebreide modus: een beschrijvingsopmerking wordt "beschrijving" en tags zoals @minimum 0 of @minLength 1 worden trefwoorden.

Methoden in interfaces worden overgeslagen. Datum wordt een tekenreeks met de notatie datum-tijd, en letterlijke vakbonden worden enum.

bigint wordt niet ondersteund en retourneert de fout 'Onbekend knooppunt'. Map en Set worden beschreven door hun interface, een object met alleen een numerieke grootte, dus gebruik Record<string, T> of arrays voor JSON-gegevens.

FAQ

Zijn niet-geëxporteerde soorten inbegrepen?

Ja. Elk type in de invoer, al dan niet geëxporteerd, wordt toegevoegd aan "definities", en verwijzingen daartussen gebruiken $ref.

Hoe worden optionele en nulbare eigenschappen weergegeven?

Optionele eigenschappen worden weggelaten uit 'vereist'. Een unie met null wordt anyOf met {"type": "null"}.

Waarom staat er een $ref in de root?

Bij een enkel type wijst de generator de root ernaar toe met $ref. Bij meerdere typen worden alleen "definities" uitgevoerd.

Specificaties en referenties