Ошибка типа при расширении Apollo useQuery возвращает тип - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь написать пользовательский обработчик запросов поверх useQuery от Apollo. Цель состоит в том, чтобы добавить несколько параметров, поле ready для результата и деструктурировать data в объекте результата.

То, что я хочу, - это возможность:

const { ready, user, loading } = useCustomQuery<{user: User}, {}>(query)

Вот что я сделал до сих пор:

import { useMemo } from "react";
import { useQuery, QueryHookOptions } from "@apollo/react-hooks";
import { QueryResult } from "@apollo/react-common";
import { isEmpty } from "lodash";
import { DocumentNode } from "graphql";

type ExtendedQueryResult<TData, TVariables> = QueryResult<TData, TVariables> &
  Partial<TData> & {
    ready: boolean;
  };

export function useCustomQuery<TData, TVariables>(
  query: DocumentNode,
  options?: QueryHookOptions<TData, TVariables>
): ExtendedQueryResult<TData, TVariables> {
  const result = useQuery<TData, TVariables>(
    query,
    useMemo(
      () => ({
        fetchPolicy: "network-only",
        notifyOnNetworkStatusChange: true,
        ...options
      }),
      [options]
    )
  );

  return {
    ...result,
    ready: !isEmpty(result.data),
    ...result.data
  };
}

Инструкция возврата вызывает следующую ошибку:

Error:(28, 3) TS2322: Type '{ ready: boolean; client: ApolloClient<any>; data: TData | undefined; error?: ApolloError | undefined; loading: boolean; networkStatus: NetworkStatus; ... 7 more ...; fetchMore: (<K extends keyof TVariables>(fetchMoreOptions: FetchMoreQueryOptions<...> & FetchMoreOptions<...>) => Promise<...>) & (<TData2, TVariables...' is not assignable to type 'ExtendedQueryResult<TData, TVariables>'.
  Type '{ ready: boolean; client: ApolloClient<any>; data: TData | undefined; error?: ApolloError | undefined; loading: boolean; networkStatus: NetworkStatus; ... 7 more ...; fetchMore: (<K extends keyof TVariables>(fetchMoreOptions: FetchMoreQueryOptions<...> & FetchMoreOptions<...>) => Promise<...>) & (<TData2, TVariables...' is not assignable to type 'ExtendedQueryResult<TData, TVariables>'.
    Type '{ ready: boolean; client: ApolloClient<any>; data: TData | undefined; error?: ApolloError | undefined; loading: boolean; networkStatus: NetworkStatus; ... 7 more ...; fetchMore: (<K extends keyof TVariables>(fetchMoreOptions: FetchMoreQueryOptions<...> & FetchMoreOptions<...>) => Promise<...>) & (<TData2, TVariables...' is not assignable to type 'Partial<TData>'.

Я не понимаю, что здесь не так. Спасибо за понимание.

...