Converter GraphQL em tipos Flow — Numio
Gera definições de tipos Flow a partir de um schema GraphQL e das operações usando @graphql-codegen/flow e flow-operations. Tipos de objeto viram objetos Flow exatos ({| |}) e campos nullable viram tipos maybe opcionais (?T).
Adicionar resultados GraphQL tipados a uma base de código que ainda faz checagem de tipos com Flow em vez de TypeScript.
Quando usar
- Adicionar resultados GraphQL tipados a uma base de código que ainda faz checagem de tipos com Flow em vez de TypeScript.
- Gerar os tipos de variáveis e de resultado de uma única query para colar ao lado de um componente.
Como usar
- Cole o SDL do schema no editor GraphQL Schema.
- Informe no editor Document as operações que você usa, ou esvazie-o se precisar apenas dos tipos do schema.
- Copie a saída, que começa com // @flow, para um arquivo .js sob Flow.
Schema GraphQL + documento
# 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 }
}Tipos 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?: * |}>,
},
|},
}Detalhes e limitações
Os campos referenciam escalares por meio de $ElementType<Scalars, "ID">; o tipo Scalars no início (omitido acima) mapeia ID e String para string, e Int e Float para number.
Os tipos de resultado das operações são montados com spreads de objeto e um helper local $Pick, então só aparecem os campos selecionados.
A geração roda em um Web Worker no seu navegador e o resultado é formatado com Prettier; a página não tem opções de plugin.
FAQ
Os tipos de objeto gerados são exatos?
Sim. Os tipos de objeto do schema usam a sintaxe de objeto exato {| ... |}, então o Flow rejeita propriedades extras.
Como os campos nullable são representados?
Um campo nullable vira uma propriedade opcional com tipo maybe, por exemplo name?: ?$ElementType<Scalars, "String">. Campos não nulos são obrigatórios e não são maybe.
Por que a saída contém um comentário "Document ignored"?
As operações do editor Document são validadas contra o schema. Se não corresponderem (o exemplo padrão consulta username), apenas os tipos do schema são gerados e o primeiro erro aparece como comentário abaixo de // @flow. Ajuste ou esvazie o documento.