Я пытаюсь написать пользовательский обработчик запросов поверх 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>'.
Я не понимаю, что здесь не так. Спасибо за понимание.