diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index f158f0fdd7..dfde4ef867 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -9,6 +9,11 @@ import type { QueryFilters, QueryTypeFilter, SkipToken } from './utils' import type { QueryCache } from './queryCache' import type { MutationCache } from './mutationCache' +export type DistributiveOmit< + TObject, + TKey extends keyof TObject, +> = TObject extends any ? Omit : never + export type OmitKeyof< TObject, TKey extends TStrictly extends 'safely' diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test-d.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test-d.tsx index 847a0f8c38..09576d63b8 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test-d.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test-d.tsx @@ -68,4 +68,15 @@ describe('useSuspenseQuery', () => { // @ts-expect-error TS2339 query.isPlaceholderData }) + + it('should type-narrow the error field', () => { + const query = useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + }) + + if (query.status === 'error') { + expectTypeOf(query.error).toEqualTypeOf() + } + }) }) diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx index 922efdbd2a..d86e710cd0 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx @@ -703,7 +703,7 @@ describe('useSuspenseQuery', () => { it('should render the correct amount of times in Suspense mode when gcTime is set to 0', async () => { const key = queryKey() - let state: UseSuspenseQueryResult | null = null + let state: UseSuspenseQueryResult | null = null let count = 0 let renders = 0 diff --git a/packages/react-query/src/types.ts b/packages/react-query/src/types.ts index 1609425301..18f632d406 100644 --- a/packages/react-query/src/types.ts +++ b/packages/react-query/src/types.ts @@ -4,6 +4,7 @@ import type { DefaultError, DefinedInfiniteQueryObserverResult, DefinedQueryObserverResult, + DistributiveOmit, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, MutateFunction, @@ -155,7 +156,7 @@ export type UseQueryResult< export type UseSuspenseQueryResult< TData = unknown, TError = DefaultError, -> = OmitKeyof< +> = DistributiveOmit< DefinedQueryObserverResult, 'isPlaceholderData' | 'promise' > diff --git a/packages/vue-query/src/types.ts b/packages/vue-query/src/types.ts index a0c9fbaf5d..afabb55ea3 100644 --- a/packages/vue-query/src/types.ts +++ b/packages/vue-query/src/types.ts @@ -55,10 +55,6 @@ export type DeepUnwrapRef = T extends UnwrapLeaf } : UnwrapRef -export type DistributiveOmit = T extends any - ? Omit - : never - export interface DefaultOptions { queries?: OmitKeyof, 'queryKey'> & { /** diff --git a/packages/vue-query/src/useMutation.ts b/packages/vue-query/src/useMutation.ts index c8f490b3f9..62c207b1ea 100644 --- a/packages/vue-query/src/useMutation.ts +++ b/packages/vue-query/src/useMutation.ts @@ -15,12 +15,13 @@ import { useQueryClient } from './useQueryClient' import type { ToRefs } from 'vue-demi' import type { DefaultError, + DistributiveOmit, MutateFunction, MutateOptions, MutationObserverOptions, MutationObserverResult, } from '@tanstack/query-core' -import type { DistributiveOmit, MaybeRefDeep } from './types' +import type { MaybeRefDeep } from './types' import type { QueryClient } from './queryClient' type MutationResult = DistributiveOmit<