Конвертировать 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-конфига, который нужно проверить перед использованием.
Как пользоваться
- Вставьте JSON-объект; добавьте несколько элементов массива, если некоторые ключи необязательные.
- Изучите сгенерированные кодеки: корневой называется RootInterface, вложенные получают имена по ключам (settings становится Settings).
- Скопируйте код, экспортируйте нужные кодеки и выведите типы через 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).