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

Конвертировать JSON в типы io-ts — Numio

Генерирует runtime-кодеки io-ts из примера JSON с предваряющим import * as t from "io-ts". Вложенные объекты становятся отдельными кодеками, объявленными раньше использующих их кодеков; ключи, отсутствующие в некоторых элементах массива, попадают в t.partial.

Проверять ответ API во время выполнения в TypeScript-приложении на fp-ts и io-ts.

JSON

IO TS

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

  • Проверять ответ API во время выполнения в TypeScript-приложении на fp-ts и io-ts.
  • Набросать кодеки для JSON-конфига, который нужно проверить перед использованием.

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

  1. Вставьте JSON-объект; добавьте несколько элементов массива, если некоторые ключи необязательные.
  2. Изучите сгенерированные кодеки: корневой называется RootInterface, вложенные получают имена по ключам (settings становится Settings).
  3. Скопируйте код, экспортируйте нужные кодеки и выведите типы через t.TypeOf.

Ввод JSON

{
  "id": "u_1",
  "name": "Ada",
  "age": 36,
  "nickname": null,
  "settings": { "theme": "dark", "fontSize": 14 },
  "posts": [
    { "title": "Notes", "draft": true },
    { "title": "Engine" }
  ]
}

Кодеки io-ts

import * as t from "io-ts"

const Settings = t.type({
  theme: t.string,
  fontSize: t.number,
})

const Posts = t.intersection([
  t.type({
    title: t.string,
  }),
  t.partial({
    draft: t.boolean,
  }),
])

const RootInterface = t.type({
  id: t.string,
  name: t.string,
  age: t.number,
  nickname: t.null,
  settings: Settings,
  posts: t.array(Posts),
})

Подробности и ограничения

Генерируется в браузере собственным генератором сайта и форматируется Prettier; настроек на странице нет, запросов к серверу она не делает.

Кодеки выводятся начиная с зависимостей, поэтому каждая const определена до того, как на неё ссылается RootInterface.

Числа становятся t.number (и целые, и дробные). null даёт t.null или t.union([X, t.null]), если в других примерах есть значение; пустые массивы дают t.array(t.unknown).

Ключи, отсутствующие в некоторых элементах массива, попадают в t.partial и объединяются с обязательными ключами через t.intersection.

FAQ

Создаёт ли он также типы TypeScript?

Не напрямую. Добавьте type Root = t.TypeOf<typeof RootInterface>, чтобы вывести статический тип из каждого кодека.

Как обрабатываются необязательные и nullable-поля?

Ключ, отсутствующий в некоторых элементах массива, помещается в t.partial; ключ, равный null в некоторых элементах, становится t.union([type, t.null]). Ключи верхнего уровня одиночного объекта всегда обязательны.

Что происходит с JSON-массивом на корневом уровне?

Элементы объединяются в один кодек RootInterface для формы элемента, и для всего массива добавляется const RootInterfaceList = t.array(RootInterface).

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