Pular para o conteúdo

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.

GraphQL Schema

Document

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

  1. Cole o SDL do schema no editor GraphQL Schema.
  2. Informe no editor Document as operações que você usa, ou esvazie-o se precisar apenas dos tipos do schema.
  3. 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.

Especificações e referências