Преобразование JSON в типы Flow — Numio
Генерирует псевдонимы типов Flow из примера JSON, начиная с // @flow. Каждый вложенный объект получает собственный экспортируемый тип, а ключи, отсутствующие в некоторых элементах массива, помечаются как необязательные через ?.
Типизировать ответы API в кодовой базе React или React Native, которая всё ещё использует Flow.
JSON
Flow
Когда пригодится
- Типизировать ответы API в кодовой базе React или React Native, которая всё ещё использует Flow.
- Написать типы для фикстур или мок-данных в наборе тестов с проверкой Flow.
Как пользоваться
- Вставьте JSON-объект в редактор.
- Откройте настройки, чтобы изменить prefix (по умолчанию I) и Root Name (по умолчанию RootObject); корневой тип становится IRootObject, вложенные типы получают тот же префикс.
- Скопируйте экспортированные типы в файл .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[].