Konwerter TypeScript na JSON Schema — Numio
Generuje JSON Schema draft-07 z typów TypeScript przy użyciu ts-json-schema-generator. Każdy typ trafia do "definitions"; właściwości opcjonalne są pomijane w "required", a obiekty otrzymują "additionalProperties": false.
Twoje typy żądań i odpowiedzi to interfejsy TypeScript i potrzebujesz schematu JSON do sprawdzania poprawności Ajv lub bramy API.
TypeScript
Kiedy go używać
- Twoje typy żądań i odpowiedzi to interfejsy TypeScript i potrzebujesz schematu JSON do sprawdzania poprawności Ajv lub bramy API.
- Chcesz opublikować schemat pliku konfiguracyjnego JSON, którego kształt jest już zdefiniowany jako typ TypeScript.
Jak używać
- Wklej interfejsy TypeScript lub wpisz aliasy. Tagi JSDoc, takie jak @minimum, @format lub @pattern, są wczytywane do schematu.
- Kod jest przetwarzany lokalnie w przeglądarce przez kompilator z wirtualnym systemem plików w pamięci i opcją expose: "all". Nie powstaje plik tymczasowy na serwerze.
- Skopiuj schemat JSON. Jeśli dane wejściowe mają tylko jeden typ, root również otrzymuje do niego $ref.
TypeScript
/** A product in the catalog */
export interface Product {
/** @minimum 0 */
price: number;
name: string;
tags?: string[];
}Schemat JSON (wersja robocza 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"
…Szczegóły i ograniczenia
Konwersja odbywa się lokalnie w Web Workerze w przeglądarce. Dane wejściowe nie są wysyłane na serwer konwersji. Wymagane moduły są pobierane przy pierwszym użyciu narzędzia.
JSDoc jest analizowany w trybie rozszerzonym: komentarz opisowy staje się "description", a znaczniki, np. @minimum 0 lub @minLength 1, stają się słowami kluczowymi.
Metody interfejsów są pomijane. Date staje się string z formatem date-time, a unie literałów stają się enum.
bigint nie jest obsługiwany i zwraca błąd "Unknown node". Map i Set są opisywane przez interfejs jako obiekt wyłącznie z liczbowym size, dlatego dla danych JSON użyj Record<string, T> lub tablic.
FAQ
Czy uwzględnione są typy niewyeksportowane?
Tak. Każdy typ w danych wejściowych, eksportowany lub nie, jest dodawany do "definitions", a odwołania między nimi używają $ref.
W jaki sposób reprezentowane są właściwości opcjonalne i dopuszczające wartość null?
Właściwości opcjonalne są pomijane w "required". Unia z null staje się anyOf z {"type": "null"}.
Dlaczego w katalogu głównym znajduje się $ref?
Przy jednym typie generator wskazuje go jako korzeń za pomocą $ref. Przy kilku typach wynik zawiera tylko "definitions".