0Pricing
TypeScript Academy · Урок

Типизированные резолверы с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Схема GraphQL в типы TypeScript
  2. Типизированные резолверы с GraphQL Code Generator
  3. Типизированный клиент GraphQL с Apollo и urql
  4. Сквозная безопасность типов: процесс от схемы
← Назад к TypeScript Academy