Перейти к содержимому

Конвертировать схему JSON в определения TypeScript — Numio

Компилирует JSON Schema в интерфейсы TypeScript с помощью json-schema-to-typescript. Свойства, не перечисленные в "required", становятся необязательными, а объекты получают индексную сигнатуру, если additionalProperties не равно false.

Ваш API публикует файлы JSON Schema, и нужны соответствующие интерфейсы для клиентского кода, который с ними работает.

JSON Schema

TypeScript

Когда пригодится

  • Ваш API публикует файлы JSON Schema, и нужны соответствующие интерфейсы для клиентского кода, который с ними работает.
  • У вас есть конфигурационные файлы, проверяемые схемой, и нужна проверка типов там, где конфигурация загружается.

Как пользоваться

  1. Вставьте JSON Schema в панель JSON Schema. "title" задаёт имя интерфейса; без него корень называется MySchema.
  2. Конвертация выполняется в браузере по мере ввода; у страницы нет настроек, и она не добавляет комментарий-баннер.
  3. Скопируйте интерфейсы из панели 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 работает в браузере на этой странице.

Спецификации и справка