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

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

Генерирует псевдонимы типов Flow из примера JSON, начиная с // @flow. Каждый вложенный объект получает собственный экспортируемый тип, а ключи, отсутствующие в некоторых элементах массива, помечаются как необязательные через ?.

Типизировать ответы API в кодовой базе React или React Native, которая всё ещё использует Flow.

JSON

Flow

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

  • Типизировать ответы API в кодовой базе React или React Native, которая всё ещё использует Flow.
  • Написать типы для фикстур или мок-данных в наборе тестов с проверкой Flow.

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

  1. Вставьте JSON-объект в редактор.
  2. Откройте настройки, чтобы изменить prefix (по умолчанию I) и Root Name (по умолчанию RootObject); корневой тип становится IRootObject, вложенные типы получают тот же префикс.
  3. Скопируйте экспортированные типы в файл .js с сохранённым заголовком // @flow.

Ввод JSON

{
  "id": 42,
  "name": "Ada Lovelace",
  "email": null,
  "active": true,
  "score": 98.5,
  "tags": ["admin", "dev"],
  "address": { "city": "London", "postCode": "NW1" }
}

Типы Flow

// @flow
export type IRootObject = {
  id: number
  name: string
  email: null
  active: boolean
  score: number
  tags: string[]
  address: IAddress
}
export type IAddress = {
  city: string
  postCode: string
}

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

Работает в браузере на библиотеке json-ts, результат форматируется Prettier; ничего не загружается.

Во Flow нет пространств имён, поэтому страница предлагает только prefix и Root Name; на выходе всегда объявления export type верхнего уровня.

Значения null типизируются как null, пустые массивы — как any[]. Замените их maybe-типами, например ?string, если в поле может быть значение.

В выводе используются неточные (inexact) объектные типы без $ReadOnly; добавьте {| |} или read-only-обёртки, если этого требует ваш проект.

FAQ

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

Только по массивам объектов: ключ, отсутствующий в некоторых элементах, становится необязательным, например giftWrap?: boolean. Ключи верхнего уровня никогда не бывают необязательными, потому что одиночному объекту не с чем сравниваться.

Можно ли преобразовать JSON-массив на корневом уровне?

Да. Корень становится псевдонимом массива, например export type IRootObject = IRootObjectItem[], а тип элемента объединяет ключи всех элементов, помечая отсутствующие как необязательные.

Поддерживаются ли массивы со смешанными типами?

Да, плоский массив вроде ["a", 2] становится (string | number)[]. Вложенные массивы становятся any[].

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