Skip to content

Commit f585bfe

Browse files
andykogTkDodo
andauthored
fix(react-query): useSuspenseQueries type not compatible with queryOption (#7194)
Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc>
1 parent 0123c80 commit f585bfe

File tree

2 files changed

+120
-2
lines changed

2 files changed

+120
-2
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { describe, expectTypeOf, it } from 'vitest'
2+
import { useSuspenseQueries } from '..'
3+
import { queryOptions } from '../queryOptions'
4+
import type { OmitKeyof } from '..'
5+
import type { UseQueryOptions } from '../types'
6+
7+
describe('UseSuspenseQueries config object overload', () => {
8+
it('TData should always be defined', () => {
9+
const query1 = {
10+
queryKey: ['key1'],
11+
queryFn: () => {
12+
return {
13+
wow: true,
14+
}
15+
},
16+
initialData: {
17+
wow: false,
18+
},
19+
}
20+
21+
const query2 = {
22+
queryKey: ['key2'],
23+
queryFn: () => 'Query Data',
24+
}
25+
26+
const queryResults = useSuspenseQueries({ queries: [query1, query2] })
27+
28+
const query1Data = queryResults[0].data
29+
const query2Data = queryResults[1].data
30+
31+
expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>()
32+
expectTypeOf(query2Data).toEqualTypeOf<string>()
33+
})
34+
35+
it('TData should be defined when passed through queryOptions', () => {
36+
const options = queryOptions({
37+
queryKey: ['key'],
38+
queryFn: () => {
39+
return {
40+
wow: true,
41+
}
42+
},
43+
})
44+
const queryResults = useSuspenseQueries({ queries: [options] })
45+
46+
const data = queryResults[0].data
47+
48+
expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>()
49+
})
50+
51+
it('it should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
52+
const query1 = queryOptions({
53+
queryKey: ['key'],
54+
queryFn: () => Promise.resolve(1),
55+
select: (data) => data > 1,
56+
})
57+
58+
const query2 = {
59+
queryKey: ['key'],
60+
queryFn: () => Promise.resolve(1),
61+
select: (data: number) => data > 1,
62+
}
63+
64+
const queryResults = useSuspenseQueries({ queries: [query1, query2] })
65+
const query1Data = queryResults[0].data
66+
const query2Data = queryResults[1].data
67+
68+
expectTypeOf(query1Data).toEqualTypeOf<boolean>()
69+
expectTypeOf(query2Data).toEqualTypeOf<boolean>()
70+
})
71+
72+
it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => {
73+
const queryResults = useSuspenseQueries({
74+
queries: [
75+
{
76+
queryKey: ['key'],
77+
queryFn: () => {
78+
return {
79+
wow: true,
80+
}
81+
},
82+
initialData: () => undefined as { wow: boolean } | undefined,
83+
},
84+
],
85+
})
86+
87+
const data = queryResults[0].data
88+
89+
expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>()
90+
})
91+
92+
describe('custom hook', () => {
93+
it('should allow custom hooks using UseQueryOptions', () => {
94+
type Data = string
95+
96+
const useCustomQueries = (
97+
options?: OmitKeyof<UseQueryOptions<Data>, 'queryKey' | 'queryFn'>,
98+
) => {
99+
return useSuspenseQueries({
100+
queries: [
101+
{
102+
...options,
103+
queryKey: ['todos-key'],
104+
queryFn: () => Promise.resolve('data'),
105+
},
106+
],
107+
})
108+
}
109+
110+
const queryResults = useCustomQueries()
111+
const data = queryResults[0].data
112+
113+
expectTypeOf(data).toEqualTypeOf<Data>()
114+
})
115+
})
116+
})

packages/react-query/src/useSuspenseQueries.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ type GetSuspenseResults<T> =
7878
? UseSuspenseQueryResult<TQueryFnData>
7979
: // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
8080
T extends {
81-
queryFn?: QueryFunction<infer TQueryFnData, any>
81+
queryFn?: QueryFunction<infer TQueryFnData, any> | SkipToken
8282
select?: (data: any) => infer TData
8383
throwOnError?: ThrowOnError<any, infer TError, any, any>
8484
}
@@ -87,7 +87,9 @@ type GetSuspenseResults<T> =
8787
unknown extends TError ? DefaultError : TError
8888
>
8989
: T extends {
90-
queryFn?: QueryFunction<infer TQueryFnData, any>
90+
queryFn?:
91+
| QueryFunction<infer TQueryFnData, any>
92+
| SkipToken
9193
throwOnError?: ThrowOnError<any, infer TError, any, any>
9294
}
9395
? UseSuspenseQueryResult<

0 commit comments

Comments
 (0)