Конвертировать схему JSON в определения TypeScript — Numio
Компилирует JSON Schema в интерфейсы TypeScript с помощью json-schema-to-typescript. Свойства, не перечисленные в "required", становятся необязательными, а объекты получают индексную сигнатуру, если additionalProperties не равно false.
Ваш API публикует файлы JSON Schema, и нужны соответствующие интерфейсы для клиентского кода, который с ними работает.
Когда пригодится
- Ваш API публикует файлы JSON Schema, и нужны соответствующие интерфейсы для клиентского кода, который с ними работает.
- У вас есть конфигурационные файлы, проверяемые схемой, и нужна проверка типов там, где конфигурация загружается.
Как пользоваться
- Вставьте JSON Schema в панель JSON Schema. "title" задаёт имя интерфейса; без него корень называется MySchema.
- Конвертация выполняется в браузере по мере ввода; у страницы нет настроек, и она не добавляет комментарий-баннер.
- Скопируйте интерфейсы из панели TypeScript. Страница форматирует их через Prettier, поэтому в них отступ в два пробела и нет точек с запятой.
JSON Schema
{
"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"]
}Интерфейсы 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
}Подробности и ограничения
Объекты без "additionalProperties": false получают [k: string]: unknown, поэтому лишние ключи в типе остаются разрешёнными.
maxItems у массива разворачивается в объединение кортежей, как у "lines" в примере.
Локальные $ref вроде #/definitions/Tag становятся отдельными экспортируемыми интерфейсами.
Страница пропускает результат через Prettier без точек с запятой, что также убирает лишние скобки вокруг объединений вроде "US" | "CA".
FAQ
Как типизируются значения null?
"type": ["integer", "null"] становится (number | null). И integer, и number отображаются в number.
Как избавиться от [k: string]: unknown?
Добавьте "additionalProperties": false в каждую схему объекта; тогда индексная сигнатура не генерируется.
Как называется корневой интерфейс?
По "title" схемы, преобразованному в PascalCase ("Example Schema" становится ExampleSchema). Без title имя — MySchema.
Отправляется ли схема на сервер?
Нет. Функция compile из json-schema-to-typescript работает в браузере на этой странице.