Saltar al contenido

Generar firmas de resolvers GraphQL — Numio

Genera firmas de tipos de resolvers para un esquema GraphQL: TypeScript (por defecto, typescript-resolvers), Flow (flow-resolvers) o Java (java-resolvers). La salida TypeScript incluye un mapa Resolvers con un objeto resolver tipado por cada tipo del esquema.

Tipar el objeto de resolvers que se pasa a Apollo Server o graphql-yoga para que se comprueben parent, args y los valores de retorno.

GraphQL Schema

Cuándo usarla

  • Tipar el objeto de resolvers que se pasa a Apollo Server o graphql-yoga para que se comprueben parent, args y los valores de retorno.
  • Obtener interfaces DataFetcher de graphql-java para cada tipo con la opción JAVA Resolvers Signature.

Cómo usarla

  1. Pega el esquema en el editor GraphQL Schema.
  2. Elige TypeScript Resolvers Signature, Flow Resolvers Signature o JAVA Resolvers Signature en el desplegable de salida.
  3. Copia la salida; en TypeScript, anota tu mapa de resolvers con el tipo Resolvers generado.

Esquema GraphQL

type Query {
  user(id: ID!): User
}

type User {
  id: ID!
  name: String
}

Firmas de resolvers

import { GraphQLResolveInfo } from "graphql"
…
export type QueryResolvers<
  ContextType = any,
  ParentType extends
    ResolversParentTypes["Query"] = ResolversParentTypes["Query"],
> = {
  user?: Resolver<
    Maybe<ResolversTypes["User"]>,
    ParentType,
    ContextType,
    RequireFields<QueryUserArgs, "id">
  >
}

export type UserResolvers<
  ContextType = any,
  ParentType extends
    ResolversParentTypes["User"] = ResolversParentTypes["User"],
> = {
  id?: Resolver<ResolversTypes["ID"], ParentType, ContextType>
  name?: Resolver<Maybe<ResolversTypes["String"]>, ParentType, ContextType>
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
}
…

Detalles y limitaciones

Los tipos generados como QueryResolvers tienen ContextType = any; los argumentos obligatorios se tipan con RequireFields y los resolvers de objeto incluyen un __isTypeOf opcional.

Solo se usa el esquema. Las firmas de resolvers no dependen de las operaciones, así que la página no tiene editor Documents.

La opción Java genera public interfaces de métodos DataFetcher dentro de public class Resolvers, en el paquete com.example.graphql. Todo se ejecuta en un Web Worker del navegador.

FAQ

¿Cómo defino mi propio tipo de contexto?

La página no tiene opciones de mappers ni contextType. Pasa tu tipo de contexto como genérico, por ejemplo Resolvers<MyContext>, ya que todos los tipos de resolver generados aceptan ContextType.

¿Por qué todos los campos de resolver son opcionales?

typescript-resolvers marca por defecto como opcional cada resolver de campo, porque los servidores GraphQL recurren a resolvers por defecto que leen la propiedad del objeto padre.

¿Cómo tipa la opción Java los campos ID?

Los campos de tipo ID y los tipos de objeto se devuelven como DataFetcher<Object>; los campos String pasan a DataFetcher<String>.

Especificaciones y referencias