Типизированные резолверы с GraphQL Code Generator
Пишите резолверы с правильными типами входных данных и возвращаемых значений
«Типизированные резолверы с GraphQL Code Generator» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Проблема типизации резолверов
Резолверы GraphQL — это обычные функции, но без типизированных сигнатур они легко возвращают структуры неправильной формы. Генерация кода создает типы резолверов, которые гарантируют корректные возвращаемые значения.
// Without typed resolvers — any type allowed
const userResolver = async (_, { id }) => fetchUser(id);Добавление плагина резолверов
Установите и настройте @graphql-codegen/typescript-resolvers, чтобы создавать типы сопоставления резолверов.
npm install --save-dev @graphql-codegen/typescript-resolversКонфигурация codegen.yml для резолверов
Добавьте вывод плагина резолверов рядом с базовыми типами TypeScript.
# codegen.yml
generates:
src/generated/types.ts:
plugins:
- typescript
src/generated/resolvers.ts:
plugins:
- typescript-resolversИспользование созданного ResolverMap
Примените созданный тип Resolvers к объекту сопоставления резолверов, чтобы обеспечить полную типобезопасность.
import { Resolvers } from "./generated/resolvers";
const resolvers: Resolvers = {
Query: {
user: async (_, { id }) => fetchUser(id),
// Return type enforced: must match User schema
},
};Типизация контекста
Передайте свой тип контекста в обобщенный тип Resolvers, чтобы функции-резолверы получали типизированный объект контекста.
interface Context { db: Database; user?: AuthUser; }
// codegen.yml
config:
contextType: "src/context#Context"
// Generated: Resolvers<Context>
const resolvers: Resolvers<Context> = {
Query: {
me: (_, __, ctx) => ctx.user, // ctx: Context
},
};Типы сопоставления
Типы сопоставления позволяют сопоставлять типы GraphQL с типами внутренних моделей, поэтому резолверы могут возвращать объекты предметной области вместо выходных типов GraphQL.
# codegen.yml
config:
mappers:
User: "src/models#UserModel"Типизация резолверов полей
Отдельные резолверы полей в типах также типизируются, включая аргументы родительского объекта и контекста.
// Typed field resolver on User type
const resolvers: Resolvers<Context> = {
User: {
fullName: (parent) => `${parent.firstName} ${parent.lastName}`,
// parent is UserModel (from mapper)
},
};Типизированные мутации
Резолверы мутаций получают типизированные входные аргументы, выведенные из входных типов схемы.
// Schema: createUser(input: CreateUserInput!): User!
const resolvers: Resolvers = {
Mutation: {
createUser: (_, { input }) => {
// input: CreateUserInput — fully typed
return createUser(input.name, input.email);
},
},
};Типизированные подписки
У резолверов подписок есть функция subscribe и функция resolve, причем обе типизируются генерацией кода.
const resolvers: Resolvers = {
Subscription: {
messageAdded: {
subscribe: () => pubsub.asyncIterator("MESSAGE_ADDED"),
resolve: (payload) => payload.messageAdded, // typed
},
},
};Синхронизация генерации кода
Добавьте хук перед сборкой или фиксацией, чтобы повторно создавать типы резолверов при изменении схемы и не допускать попадания устаревших типов в рабочую среду.
// package.json
{
"scripts": {
"predev": "graphql-codegen",
"prebuild": "graphql-codegen"
}
}Повторение: типизированные резолверы
Плагин генерации кода typescript-resolvers создает тип Resolvers, который обеспечивает корректные структуры возвращаемых значений, типы аргументов и структуру контекста во всех ваших резолверах GraphQL.
Быстрая проверка
Что делает параметр конфигурации contextType в генерации кода?
Что вы узнали
Типизированные резолверы GraphQL, созданные генерацией кода, обеспечивают корректные возвращаемые типы, структуры аргументов и объекты контекста во всем объекте сопоставления резолверов. Используйте типы сопоставления для объектов предметной области и включите генерацию кода в конвейер сборки, чтобы предотвращать рассинхронизацию.
Часто задаваемые вопросы
Урок «Типизированные резолверы с GraphQL Code Generator» бесплатный?
Да — полный текст урока «Типизированные резолверы с GraphQL Code Generator» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Типизированные резолверы с GraphQL Code Generator»?
Пишите резолверы с правильными типами входных данных и возвращаемых значений Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Типизированные резолверы с GraphQL Code Generator»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Схема GraphQL в типы TypeScript
- Типизированные резолверы с GraphQL Code Generator
- Типизированный клиент GraphQL с Apollo и urql
- Сквозная безопасность типов: процесс от схемы