Skip to content

Commit 77a7b28

Browse files
gwansikkTkDodo
andauthoredJun 16, 2024··
refactor(react-query): improve type inference for useSuspenseQueries with skipToken (#7564)
Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc>
1 parent 8d69ef4 commit 77a7b28

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed
 

‎packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { describe, expectTypeOf, it } from 'vitest'
2-
import { useSuspenseQueries } from '..'
2+
import { skipToken, useSuspenseQueries } from '..'
33
import { queryOptions } from '../queryOptions'
44
import type { OmitKeyof } from '..'
5-
import type { UseQueryOptions } from '../types'
5+
import type { UseQueryOptions, UseSuspenseQueryResult } from '../types'
66

77
describe('UseSuspenseQueries config object overload', () => {
88
it('TData should always be defined', () => {
@@ -113,4 +113,22 @@ describe('UseSuspenseQueries config object overload', () => {
113113
expectTypeOf(data).toEqualTypeOf<Data>()
114114
})
115115
})
116+
117+
it('TData should have correct type when conditional skipToken is passed', () => {
118+
const queryResults = useSuspenseQueries({
119+
queries: [
120+
{
121+
queryKey: ['withSkipToken'],
122+
queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5),
123+
},
124+
],
125+
})
126+
127+
const firstResult = queryResults[0]
128+
129+
expectTypeOf(firstResult).toEqualTypeOf<
130+
UseSuspenseQueryResult<number, Error>
131+
>()
132+
expectTypeOf(firstResult.data).toEqualTypeOf<number>()
133+
})
116134
})

‎packages/react-query/src/useSuspenseQueries.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import type {
66
DefaultError,
77
QueryClient,
88
QueryFunction,
9-
SkipToken,
109
ThrowOnError,
1110
} from '@tanstack/query-core'
1211

1312
// Avoid TS depth-limit error in case of large array literal
1413
type MAXIMUM_DEPTH = 20
1514

15+
// Widen the type of the symbol to enable type inference even if skipToken is not immutable.
16+
type SkipTokenForUseQueries = symbol
17+
1618
type GetUseSuspenseQueryOptions<T> =
1719
// Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }
1820
T extends {
@@ -36,7 +38,7 @@ type GetUseSuspenseQueryOptions<T> =
3638
T extends {
3739
queryFn?:
3840
| QueryFunction<infer TQueryFnData, infer TQueryKey>
39-
| SkipToken
41+
| SkipTokenForUseQueries
4042
select?: (data: any) => infer TData
4143
throwOnError?: ThrowOnError<any, infer TError, any, any>
4244
}
@@ -49,7 +51,7 @@ type GetUseSuspenseQueryOptions<T> =
4951
: T extends {
5052
queryFn?:
5153
| QueryFunction<infer TQueryFnData, infer TQueryKey>
52-
| SkipToken
54+
| SkipTokenForUseQueries
5355
throwOnError?: ThrowOnError<any, infer TError, any, any>
5456
}
5557
? UseSuspenseQueryOptions<
@@ -78,7 +80,9 @@ type GetUseSuspenseQueryResult<T> =
7880
? UseSuspenseQueryResult<TQueryFnData>
7981
: // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
8082
T extends {
81-
queryFn?: QueryFunction<infer TQueryFnData, any> | SkipToken
83+
queryFn?:
84+
| QueryFunction<infer TQueryFnData, any>
85+
| SkipTokenForUseQueries
8286
select?: (data: any) => infer TData
8387
throwOnError?: ThrowOnError<any, infer TError, any, any>
8488
}
@@ -89,7 +93,7 @@ type GetUseSuspenseQueryResult<T> =
8993
: T extends {
9094
queryFn?:
9195
| QueryFunction<infer TQueryFnData, any>
92-
| SkipToken
96+
| SkipTokenForUseQueries
9397
throwOnError?: ThrowOnError<any, infer TError, any, any>
9498
}
9599
? UseSuspenseQueryResult<

0 commit comments

Comments
 (0)
Please sign in to comment.