GraphQL解決器の署名ジェネレーター — Numio
GraphQL スキーマからリゾルバーの型シグネチャを生成します。TypeScript(デフォルト、typescript-resolvers)、Flow(flow-resolvers)、Java(java-resolvers)に対応します。TypeScript の出力には、スキーマの型ごとに型付きリゾルバーオブジェクトを 1 つ持つ Resolvers マップが含まれます。
Apollo Server や graphql-yoga に渡す resolvers オブジェクトに型を付け、parent、args、戻り値をチェックする。
こんなときに使えます
- Apollo Server や graphql-yoga に渡す resolvers オブジェクトに型を付け、parent、args、戻り値をチェックする。
- JAVA Resolvers Signature オプションで、型ごとの graphql-java DataFetcher インターフェースを得る。
使い方
- GraphQL Schema エディターにスキーマを貼り付けます。
- 出力のドロップダウンで TypeScript Resolvers Signature、Flow Resolvers Signature、JAVA Resolvers Signature のいずれかを選びます。
- 出力をコピーします。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> になります。