TypeScript in JSON Schema umwandeln — Numio
Erzeugt mit ts-json-schema-generator ein draft-07 JSON Schema aus TypeScript-Typen. Jeder Typ landet unter "definitions"; optionale Properties fehlen in "required", und Objekte erhalten "additionalProperties": false.
Deine Request- und Response-Typen sind TypeScript-Interfaces, und du brauchst JSON Schema für Ajv-Validierung oder ein API-Gateway.
TypeScript
Wann sie hilft
- Deine Request- und Response-Typen sind TypeScript-Interfaces, und du brauchst JSON Schema für Ajv-Validierung oder ein API-Gateway.
- Du willst ein Schema für eine JSON-Konfigurationsdatei veröffentlichen, deren Struktur bereits als TypeScript-Typ definiert ist.
Anwendung
- Füge TypeScript-Interfaces oder Typaliase ein. JSDoc-Tags wie @minimum, @format oder @pattern werden ins Schema übernommen.
- Der Quelltext wird an /api/typescript-to-json-schema gesendet, auf dem Server in eine temporäre Datei geschrieben und mit allen Typen als exponiert verarbeitet.
- Kopiere das JSON Schema. Enthält die Eingabe nur einen Typ, erhält die Wurzel zusätzlich einen $ref darauf.
TypeScript
/** A product in the catalog */
export interface Product {
/** @minimum 0 */
price: number;
name: string;
tags?: string[];
}JSON Schema (draft-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 und Einschränkungen
Die Seite sendet deine Eingabe zur Konvertierung an eine Server-Route (/api/typescript-to-json-schema); sie wird nicht nur im Browser verarbeitet. Next.js-API-Routen akzeptieren standardmäßig Request-Bodys bis 1 MB.
JSDoc wird im erweiterten Modus geparst: Ein Beschreibungskommentar wird zu "description", und Tags wie @minimum 0 oder @minLength 1 werden zu Schlüsselwörtern.
Methoden in Interfaces werden übersprungen. Date wird zu einem string mit format date-time, und Literal-Unions werden zu enum.
bigint wird nicht unterstützt und liefert einen "Unknown node"-Fehler. Map und Set werden über ihr Interface beschrieben, ein Objekt mit nur einem numerischen size; verwende für JSON-Daten daher Record<string, T> oder Arrays.
FAQ
Werden nicht exportierte Typen einbezogen?
Ja. Jeder Typ in der Eingabe, exportiert oder nicht, wird zu "definitions" hinzugefügt, und Verweise untereinander verwenden $ref.
Wie werden optionale und nullable Properties dargestellt?
Optionale Properties fehlen in "required". Eine Union mit null wird zu anyOf mit {"type": "null"}.
Warum gibt es an der Wurzel einen $ref?
Bei einem einzigen Typ lässt der Generator die Wurzel per $ref darauf verweisen. Bei mehreren Typen wird nur "definitions" ausgegeben.