Конвертировать TypeScript в схему JSON — Numio
Генерирует JSON Schema draft-07 из типов TypeScript с помощью ts-json-schema-generator. Каждый тип помещается в "definitions"; необязательные свойства не попадают в "required", а объекты получают "additionalProperties": false.
Типы запросов и ответов описаны интерфейсами TypeScript, и нужна JSON Schema для валидации через Ajv или для API-шлюза.
TypeScript
Когда пригодится
- Типы запросов и ответов описаны интерфейсами TypeScript, и нужна JSON Schema для валидации через Ajv или для API-шлюза.
- Вы хотите опубликовать схему для конфигурационного файла JSON, структура которого уже описана типом TypeScript.
Как пользоваться
- Вставьте интерфейсы TypeScript или псевдонимы типов. Теги JSDoc вроде @minimum, @format или @pattern переносятся в схему.
- Исходный код отправляется на /api/typescript-to-json-schema, записывается на сервере во временный файл и обрабатывается с экспозицией всех типов.
- Скопируйте JSON Schema. Если во вводе только один тип, корень дополнительно получает $ref на него.
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"
…Подробности и ограничения
Страница отправляет ваши данные на серверный маршрут (/api/typescript-to-json-schema) для конвертации; они обрабатываются не только в браузере. API-маршруты Next.js по умолчанию принимают тело запроса размером до 1 МБ.
JSDoc разбирается в расширенном режиме: комментарий-описание становится "description", а теги вроде @minimum 0 или @minLength 1 — ключевыми словами.
Методы в интерфейсах пропускаются. Date становится string с format date-time, а объединения литералов — enum.
bigint не поддерживается и приводит к ошибке "Unknown node". Map и Set описываются своим интерфейсом — объектом только с числовым size, поэтому для JSON-данных используйте Record<string, T> или массивы.
FAQ
Включаются ли неэкспортируемые типы?
Да. Каждый тип из ввода, экспортируемый или нет, добавляется в "definitions", а ссылки между ними используют $ref.
Как представлены необязательные и nullable-свойства?
Необязательные свойства не попадают в "required". Объединение с null становится anyOf с {"type": "null"}.
Почему в корне есть $ref?
При единственном типе генератор указывает на него из корня через $ref. При нескольких типах выводится только "definitions".