Конвертировать GraphQL в типы Flow — Numio
Генерирует определения типов Flow из GraphQL-схемы и операций с помощью @graphql-codegen/flow и flow-operations. Объектные типы становятся точными объектами Flow ({| |}), а nullable-поля — необязательными maybe-типами (?T).
Добавить типизированные результаты GraphQL в кодовую базу, которая всё ещё проверяется Flow, а не TypeScript.
Когда пригодится
- Добавить типизированные результаты GraphQL в кодовую базу, которая всё ещё проверяется Flow, а не TypeScript.
- Сгенерировать типы переменных и результата для одного запроса, чтобы положить их рядом с компонентом.
Как пользоваться
- Вставьте SDL схемы в редактор GraphQL Schema.
- Введите используемые операции в редактор Document или очистите его, если нужны только типы схемы.
- Скопируйте вывод, начинающийся с // @flow, в .js-файл под Flow.
GraphQL-схема + document
# GraphQL Schema editor
type Query {
user(id: ID!): User
}
type User {
id: ID!
name: String
tags: [String!]!
}
# Document editor
query GetUser($id: ID!) {
user(id: $id) { id name }
}Типы Flow
// @flow
…
export type User = {|
__typename?: "User",
id: $ElementType<Scalars, "ID">,
name?: ?$ElementType<Scalars, "String">,
tags: Array<$ElementType<Scalars, "String">>,
|}
export type GetUserQueryVariables = {
id: $ElementType<Scalars, "ID">,
}
export type GetUserQuery = {
...{ __typename?: "Query" },
...{|
user?: ?{
...{ __typename?: "User" },
...$Pick<User, {| id: *, name?: * |}>,
},
|},
}Подробности и ограничения
Поля ссылаются на скаляры через $ElementType<Scalars, "ID">; тип Scalars в начале (выше опущен) сопоставляет ID и String со string, а Int и Float — с number.
Типы результатов операций строятся из object spread и локального хелпера $Pick, поэтому в них попадают только выбранные поля.
Генерация выполняется в Web Worker в браузере, результат форматируется Prettier; опций плагина на странице нет.
FAQ
Являются ли сгенерированные объектные типы точными?
Да. Объектные типы схемы используют синтаксис точных объектов {| ... |}, поэтому Flow отклоняет лишние свойства.
Как представлены nullable-поля?
Nullable-поле становится необязательным свойством с maybe-типом, например name?: ?$ElementType<Scalars, "String">. Non-null поля обязательны и не являются maybe.
Почему в выводе есть комментарий "Document ignored"?
Операции в редакторе Document проверяются по схеме. Если они не совпадают (пример по умолчанию запрашивает username), генерируются только типы схемы, а первая ошибка выводится комментарием под // @flow. Исправьте документ или очистите его.