Как избавиться от дублирования практически одинаковых api в RTK Query?

В RTK Query, дублирование практически одинаковых API может быть очень раздражающим и неэффективным. Однако, существует несколько путей для избавления от дублирования кода при определении API в RTK Query.

1. Использование базовой схемы:
RTK Query позволяет определить базовую схему для апи, которая будет использоваться в нескольких местах. Базовая схема включает в себя URL, хедеры, авторизацию и другие общие параметры запроса. Вы можете определить базовую схему с помощью функции baseQuery. Это позволяет использовать настройки запроса из базовой схемы для всех остальных запросов.

   import { createApi, baseQuery } from '@reduxjs/toolkit/query/react';

   const api = createApi({
     baseQuery: baseQuery({
       baseUrl: '/api',
       headers: {
         'Content-Type': 'application/json',
       },
     }),
     // ...
   });

2. Использование операций запроса:
RTK Query позволяет определить операции запроса, которые имеют общие параметры и могут быть повторно использованы в разных местах. Операции запроса могут быть определены с помощью функции baseQuery. После определения операции запроса, вы можете использовать ее в разных местах при определении апи.

   import { createApi, baseQuery } from '@reduxjs/toolkit/query/react';

   const fetchUsers = baseQuery({
     query: () => ({
       url: '/users',
       method: 'GET',
     }),
   });

   const api = createApi({
     endpoints: (builder) => ({
       getUsers: builder.query({
         query: () => fetchUsers,
       }),
       getUserById: builder.query({
         // Additional parameters for this query can be added here
         query: (id: number) => ({
           ...fetchUsers.query(),
           url: `/users/${id}`,
         }),
       }),
     }),
   });

3. Повторное использование эндпоинтов:
RTK Query позволяет повторно использовать уже определенные эндпоинты при определении других эндпоинтов. Это может быть полезно, если у вас есть несколько эндпоинтов с одинаковым или похожими параметрами запроса.

   import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

   const api = createApi({
     baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
     endpoints: (builder) => ({
       getUsers: builder.query({
         query: () => ({ url: '/users', method: 'GET' }),
       }),
       getAdmins: builder.query({
         // Reuse getUsers endpoint
         query: () => api.endpoints.getUsers.initiate(),
       }),
     }),
   });

4. Использование шаблонов запросов:
В RTK Query можно использовать шаблоны запросов (query templates), которые позволяют определить общие параметры запроса и повторно использовать их в разных эндпоинтах.

   import { createApi, fetchBaseQuery, QueryTemplate } from '@reduxjs/toolkit/query/react';

   const fetchUser: QueryTemplate<User, number> = (id) => ({
     url: `/users/${id}`,
     method: 'GET',
   });

   const api = createApi({
     baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
     endpoints: (builder) => ({
       getUser: builder.query({
         query: (id) => fetchUser(id),
       }),
       getAdmin: builder.query({
         // Reuse fetchUser template
         query: () => fetchUser(1),
       }),
     }),
   });

Это некоторые из способов, которые можно использовать для избегания дублирования практически одинаковых API в RTK Query. Выберите тот, который лучше всего соответствует вашей конкретной ситуации и поможет сделать ваш код чище и более эффективным.