Используйте RTK-запрос с Graphql

#graphql-codegen #rtk-query

Вопрос:

До сих пор я понимаю, что мне нужно построить свой собственный baseQuery . Я мог бы писать запросы graphql и мутации, как в примере здесь https://rtk-query-docs.netlify.app/examples/react-with-graphql, получу ли я полную безопасность типов для запросов и мутаций, если я добавлю типы query.builder , подобные этому builder.query<Device, void> , или я должен использовать что-то подобное https://www.graphql-code-generator.com/docs/plugins/typescript-graphql-request#simple-request-middleware. В последнем случае, как я должен baseQuery выглядеть, если я использую сгенерированный крюк для библиотеки запросов graphql.

Вот пример крючка из 2:

 import { GraphQLClient } from 'graphql-request';
import { getSdk } from './sdk'; // THIS FILE IS THE GENERATED FILE
async function main() {
  const client = new GraphQLClient('https://countries.trevorblades.com/');
  const sdk = getSdk(client);
  const { continents } = await sdk.continents(); // This is fully typed, based on the query
  console.log(`GraphQL data:`, continents);
}
 

Я думаю о чем-то вроде:

     import {getSdk} from './sdk'
    const client = new GraphQLClient('https://countries.trevorblades.com/');
    const graphqlBaseQuery = (someGeneratedQueryOrMutation, client) => {
      const something = someGeneratedQueryOrMutation(client);
      const { continents } = await something.continents();
      return { data: continents };
    };
 

Код на самом деле не имеет смысла, но я надеюсь, вы понимаете, к чему я клоню. Спасибо 🙂

Ответ №1:

Редактировать: К настоящему времени плагин Grahql Codegen доступен по адресу https://www.graphql-code-generator.com/docs/plugins/typescript-rtk-query


На самом деле я начал писать плагин для генератора кода несколько дней назад. Вы можете увидеть полученный результат здесь: https://github.com/phryneas/graphql-code-generator/blob/5f9a2eefd81538782b791e0cc5df633935164a89/dev-test/githunt/types.rtk-query.ts#L406-L427

Для этого вам потребуется создать api с базовым запросом, используя библиотеку graphql по вашему выбору, подобную этой.

Конфигурация будет выглядеть следующим образом

   ./dev-test/githunt/types.rtk-query.ts:
    schema: ./dev-test/githunt/schema.json
    documents: ./dev-test/githunt/**/*.graphql
    plugins:
      - typescript
      - typescript-operations
      - typescript-rtk-query
    config:
      importBaseApiFrom: '../../packages/plugins/typescript/rtk-query/tests/baseApi'
      exportHooks: true
 

И я думаю, что для целей разделения пакетов он также будет работать с near-operation-file предустановкой.

Все, что еще не сделано — я постараюсь подготовить это в эти выходные, но не знаю, сколько времени потребуется, чтобы на самом деле это сделать.

Вы могли бы проверить репозиторий, выполнить локальную сборку и установить его с помощью чего-то подобного yalc .

Для более простого подхода без генерации кода вы можете посмотреть этот пример или для немного более продвинутой настройки (но также без полной генерации кода, более интегрированной с существующими инструментами), вы можете посмотреть этот PR

Комментарии:

1. Вы помогли мне на github 😀

2. Просто в качестве обновления: теперь доступен плагин graphql codegen. graphql-code-generator.com/docs/plugins/typescript-rtk-query