Skip to content

Commit 5c7927d

Browse files
TkDodomanudeli
andauthored
fix(types): useSuspenseQuery should type-narrow the Error field (#9105)
* fix(types): useSuspenseQuery should type-narrow the Error field * Update packages/query-core/src/types.ts Co-authored-by: Jonghyeon Ko <[email protected]> * Update packages/query-core/src/types.ts Co-authored-by: Jonghyeon Ko <[email protected]> * ref: use DistributiveOmit from query-core in vue-query * chore: fix type error in tests --------- Co-authored-by: Jonghyeon Ko <[email protected]>
1 parent 89846b7 commit 5c7927d

File tree

6 files changed

+21
-7
lines changed

6 files changed

+21
-7
lines changed

packages/query-core/src/types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import type { QueryFilters, QueryTypeFilter, SkipToken } from './utils'
99
import type { QueryCache } from './queryCache'
1010
import type { MutationCache } from './mutationCache'
1111

12+
export type DistributiveOmit<
13+
TObject,
14+
TKey extends keyof TObject,
15+
> = TObject extends any ? Omit<TObject, TKey> : never
16+
1217
export type OmitKeyof<
1318
TObject,
1419
TKey extends TStrictly extends 'safely'

packages/react-query/src/__tests__/useSuspenseQuery.test-d.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,15 @@ describe('useSuspenseQuery', () => {
6868
// @ts-expect-error TS2339
6969
query.isPlaceholderData
7070
})
71+
72+
it('should type-narrow the error field', () => {
73+
const query = useSuspenseQuery({
74+
queryKey: ['key'],
75+
queryFn: () => Promise.resolve(5),
76+
})
77+
78+
if (query.status === 'error') {
79+
expectTypeOf(query.error).toEqualTypeOf<Error>()
80+
}
81+
})
7182
})

packages/react-query/src/__tests__/useSuspenseQuery.test.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ describe('useSuspenseQuery', () => {
703703

704704
it('should render the correct amount of times in Suspense mode when gcTime is set to 0', async () => {
705705
const key = queryKey()
706-
let state: UseSuspenseQueryResult<number> | null = null
706+
let state: UseSuspenseQueryResult<number, Error | null> | null = null
707707

708708
let count = 0
709709
let renders = 0

packages/react-query/src/types.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {
44
DefaultError,
55
DefinedInfiniteQueryObserverResult,
66
DefinedQueryObserverResult,
7+
DistributiveOmit,
78
InfiniteQueryObserverOptions,
89
InfiniteQueryObserverResult,
910
MutateFunction,
@@ -155,7 +156,7 @@ export type UseQueryResult<
155156
export type UseSuspenseQueryResult<
156157
TData = unknown,
157158
TError = DefaultError,
158-
> = OmitKeyof<
159+
> = DistributiveOmit<
159160
DefinedQueryObserverResult<TData, TError>,
160161
'isPlaceholderData' | 'promise'
161162
>

packages/vue-query/src/types.ts

-4
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ export type DeepUnwrapRef<T> = T extends UnwrapLeaf
5555
}
5656
: UnwrapRef<T>
5757

58-
export type DistributiveOmit<T, TKeyOfAny extends keyof any> = T extends any
59-
? Omit<T, TKeyOfAny>
60-
: never
61-
6258
export interface DefaultOptions<TError = DefaultError> {
6359
queries?: OmitKeyof<QueryObserverOptions<unknown, TError>, 'queryKey'> & {
6460
/**

packages/vue-query/src/useMutation.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ import { useQueryClient } from './useQueryClient'
1515
import type { ToRefs } from 'vue-demi'
1616
import type {
1717
DefaultError,
18+
DistributiveOmit,
1819
MutateFunction,
1920
MutateOptions,
2021
MutationObserverOptions,
2122
MutationObserverResult,
2223
} from '@tanstack/query-core'
23-
import type { DistributiveOmit, MaybeRefDeep } from './types'
24+
import type { MaybeRefDeep } from './types'
2425
import type { QueryClient } from './queryClient'
2526

2627
type MutationResult<TData, TError, TVariables, TContext> = DistributiveOmit<

0 commit comments

Comments
 (0)