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

Преобразование JSON в типы Sarcastic — Numio

Генерирует валидаторы для библиотеки runtime-проверки типов sarcastic по примеру JSON. Объекты становятся is.shape({...}), массивы — is.arrayOf(...), а ключи, отсутствующие в некоторых элементах массива, оборачиваются в is.maybe(...).

Проверять форму полученного JSON во время выполнения в небольшом JavaScript-проекте без библиотеки схем.

JSON

Sarcastic

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

  • Проверять форму полученного JSON во время выполнения в небольшом JavaScript-проекте без библиотеки схем.
  • Защитить payload конфигурации или сообщений проверками, которые бросают исключение на неожиданных данных.

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

  1. Вставьте JSON-объект; чтобы пометить поля как необязательные, добавьте элементы массива с ними и без них.
  2. Изучите результат: корневая форма называется RootInterface, вложенные формы получают имена по ключам (posts становится Posts).
  3. Скопируйте код и проверяйте данные через is(data, RootInterface), который возвращает значение или бросает исключение при несоответствии.

Ввод JSON

{
  "id": 1,
  "name": "Ada",
  "nickname": null,
  "tags": ["math"],
  "posts": [
    { "title": "Notes", "draft": true },
    { "title": "Engine" }
  ]
}

Валидаторы sarcastic

import is from "sarcastic"

const anyValue = (value) => value

const Posts = is.shape({
  title: is.string,
  draft: is.maybe(is.boolean),
})

const RootInterface = is.shape({
  id: is.number,
  name: is.string,
  nickname: is.maybe(anyValue),
  tags: is.arrayOf(is.string),
  posts: is.arrayOf(Posts),
})

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

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

В sarcastic нет проверки "any", поэтому значение, которое только null, становится is.maybe(anyValue) с небольшим хелпером const anyValue = (value) => value, добавленным в вывод.

И целые, и дробные числа — is.number. Пустые массивы становятся is.array; смешанные массивы используют is.either, например is.arrayOf(is.either(is.number, is.string)).

Формы объявляются раньше использующих их форм, поэтому код работает сразу после вставки.

FAQ

Как представлены необязательные поля?

Ключи, отсутствующие в некоторых объектах одного массива или равные в них null, оборачиваются в is.maybe(...), который принимает null и undefined. Ключи верхнего уровня одиночного объекта всегда обязательны.

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

Элементы объединяются в одну форму RootInterface, описывающую один элемент, и для всего массива добавляется const RootInterfaceList = is.arrayOf(RootInterface).

sarcastic — то же самое, что io-ts или Zod?

Нет. sarcastic — более компактная библиотека без статического вывода типов. Если нужны и типы TypeScript, лучше подойдут страницы JSON to Zod или JSON to io-ts.

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