Генератор сигнатур резолверов GraphQL — Numio
Генерирует сигнатуры типов резолверов для GraphQL-схемы: TypeScript (по умолчанию, typescript-resolvers), Flow (flow-resolvers) или Java (java-resolvers). Вывод TypeScript включает карту Resolvers с одним типизированным объектом резолверов на каждый тип схемы.
Типизировать объект резолверов, передаваемый в Apollo Server или graphql-yoga, чтобы проверялись parent, args и возвращаемые значения.
Когда пригодится
- Типизировать объект резолверов, передаваемый в Apollo Server или graphql-yoga, чтобы проверялись parent, args и возвращаемые значения.
- Получить интерфейсы DataFetcher для graphql-java по каждому типу с вариантом JAVA Resolvers Signature.
Как пользоваться
- Вставьте схему в редактор 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 выводит public interface с методами DataFetcher внутри public class Resolvers в пакете com.example.graphql. Всё выполняется в Web Worker в браузере.
FAQ
Как задать собственный тип контекста?
На странице нет опций mapper и contextType. Передайте свой тип контекста как generic-параметр, например Resolvers<MyContext>, поскольку каждый сгенерированный тип резолвера принимает ContextType.
Почему все поля резолверов необязательны?
typescript-resolvers по умолчанию помечает каждый резолвер поля как необязательный, потому что GraphQL-серверы используют резолверы по умолчанию, читающие свойство из родительского объекта.
Как вариант Java типизирует поля ID?
Поля типа ID и объектных типов возвращаются как DataFetcher<Object>; поля String становятся DataFetcher<String>.