本文へスキップ

GraphQL解決器の署名ジェネレーター — Numio

GraphQL スキーマからリゾルバーの型シグネチャを生成します。TypeScript(デフォルト、typescript-resolvers)、Flow(flow-resolvers)、Java(java-resolvers)に対応します。TypeScript の出力には、スキーマの型ごとに型付きリゾルバーオブジェクトを 1 つ持つ Resolvers マップが含まれます。

Apollo Server や graphql-yoga に渡す resolvers オブジェクトに型を付け、parent、args、戻り値をチェックする。

GraphQL Schema

こんなときに使えます

  • Apollo Server や graphql-yoga に渡す resolvers オブジェクトに型を付け、parent、args、戻り値をチェックする。
  • JAVA Resolvers Signature オプションで、型ごとの graphql-java DataFetcher インターフェースを得る。

使い方

  1. GraphQL Schema エディターにスキーマを貼り付けます。
  2. 出力のドロップダウンで TypeScript Resolvers Signature、Flow Resolvers Signature、JAVA Resolvers Signature のいずれかを選びます。
  3. 出力をコピーします。TypeScript の場合は、リゾルバーマップに生成された Resolvers 型を付けます。

GraphQL スキーマ

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

type User {
  id: ID!
  name: String
}

リゾルバーシグネチャ

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>
}
…

仕様と制限

QueryResolvers などの生成型は ContextType = any です。必須の引数は RequireFields で型付けされ、オブジェクトのリゾルバーには省略可能な __isTypeOf が含まれます。

使うのはスキーマだけです。リゾルバーシグネチャはオペレーションに依存しないため、このページには Documents エディターがありません。

Java オプションは、package com.example.graphql の public class Resolvers の中に、DataFetcher メソッドを持つ public interface を出力します。すべてブラウザの Web Worker で実行されます。

FAQ

独自のコンテキスト型を指定するには?

ページに mapper や contextType のオプションはありません。生成されるリゾルバー型はどれも ContextType を受け取るので、Resolvers<MyContext> のようにジェネリクスでコンテキスト型を渡してください。

リゾルバーのフィールドがすべて省略可能なのはなぜですか?

GraphQL サーバーは親オブジェクトのプロパティを読むデフォルトリゾルバーにフォールバックするため、typescript-resolvers はデフォルトですべてのフィールドリゾルバーを省略可能にします。

Java オプションでは ID フィールドの型はどうなりますか?

ID 型とオブジェクト型のフィールドは DataFetcher<Object> を返し、String のフィールドは DataFetcher<String> になります。

仕様を確認する