Convertir GraphQL a tipos de Flow — Numio
Genera definiciones de tipos Flow a partir de un esquema GraphQL y sus operaciones con @graphql-codegen/flow y flow-operations. Los tipos de objeto pasan a objetos Flow exactos ({| |}) y los campos nullable pasan a tipos maybe opcionales (?T).
Añadir resultados GraphQL tipados a una base de código que todavía comprueba tipos con Flow en lugar de TypeScript.
Cuándo usarla
- Añadir resultados GraphQL tipados a una base de código que todavía comprueba tipos con Flow en lugar de TypeScript.
- Generar los tipos de variables y de resultado de una sola query para pegarlos junto a un componente.
Cómo usarla
- Pega el SDL del esquema en el editor GraphQL Schema.
- Escribe en el editor Document las operaciones que usas, o vacíalo si solo necesitas los tipos del esquema.
- Copia la salida, que empieza por // @flow, en un archivo .js bajo Flow.
Esquema 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?: * |}>,
},
|},
}Detalles y limitaciones
Los campos hacen referencia a los escalares mediante $ElementType<Scalars, "ID">; el tipo Scalars del principio (omitido arriba) asigna ID y String a string, e Int y Float a number.
Los tipos de resultado de las operaciones se construyen con spreads de objeto y un helper local $Pick, así que solo aparecen los campos seleccionados.
La generación se ejecuta en un Web Worker de tu navegador y el resultado se formatea con Prettier; la página no tiene opciones de plugin.
FAQ
¿Los tipos de objeto generados son exactos?
Sí. Los tipos de objeto del esquema usan la sintaxis de objeto exacto {| ... |}, así que Flow rechaza propiedades adicionales.
¿Cómo se representan los campos nullable?
Un campo nullable pasa a una propiedad opcional con tipo maybe, por ejemplo name?: ?$ElementType<Scalars, "String">. Los campos no nulos son obligatorios y no son maybe.
¿Por qué la salida contiene un comentario "Document ignored"?
Las operaciones del editor Document se validan contra el esquema. Si no coinciden (el ejemplo por defecto consulta username), solo se generan los tipos del esquema y el primer error aparece como comentario debajo de // @flow. Ajusta o vacía el documento.