Skip to content

Commit 5f80b09

Browse files
authored
fix: type issue when void or undefined is returned from query function (#3541)
* fix(types): fix handling of promise return type in QueryFunctionData * fix(QueryFunction): return type restrict void and avoid union type distribution * fix(QueryClient): make setQueryDefaults compatible with adjusted QueryFunction type * fix(useQueries): correct type inferrence in GetResults with new QueryFunction type * fix(tests): adjust all test cases which use any or never as query function return type to comply with new QueryFunction type * fix(tests): change incorrect query function return types of query tests from string to unknown * feature(useQuery): add test cases covering void and Promise<void> return types * feature(useQueries): reject void or undefined as query function return type * feature(useQueries): add test cases for invalid query function return types * fix tsc error after rebasing lastest beta branch
1 parent 6379654 commit 5f80b09

14 files changed

+259
-115
lines changed

src/core/queryClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ export class QueryClient {
536536

537537
setQueryDefaults(
538538
queryKey: QueryKey,
539-
options: QueryObserverOptions<any, any, any, any>
539+
options: QueryObserverOptions<unknown, any, any, any>
540540
): void {
541541
const result = this.queryDefaults.find(
542542
x => hashQueryKey(queryKey) === hashQueryKey(x.queryKey)

src/core/tests/hydration.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe('dehydration and rehydration', () => {
4444
key: [{ nestedKey: 1 }],
4545
})
4646

47-
const fetchDataAfterHydration = jest.fn()
47+
const fetchDataAfterHydration = jest.fn<unknown, unknown[]>()
4848
await hydrationClient.prefetchQuery(['string'], fetchDataAfterHydration, {
4949
staleTime: 1000,
5050
})
@@ -143,7 +143,7 @@ describe('dehydration and rehydration', () => {
143143
hydrationCache.find(['string', { key: ['string'], key2: 0 }])?.state.data
144144
).toBe('string')
145145

146-
const fetchDataAfterHydration = jest.fn()
146+
const fetchDataAfterHydration = jest.fn<unknown, unknown[]>()
147147
await hydrationClient.prefetchQuery(
148148
['string', { key: ['string'], key2: 0 }],
149149
fetchDataAfterHydration,

src/core/tests/query.test.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('query', () => {
153153

154154
const promise = queryClient.fetchQuery(
155155
key,
156-
async () => {
156+
async (): Promise<unknown> => {
157157
count++
158158
throw new Error(`error${count}`)
159159
},
@@ -282,7 +282,7 @@ describe('query', () => {
282282
const key = queryKey()
283283

284284
const queryFn = jest.fn<
285-
Promise<void>,
285+
Promise<unknown>,
286286
[QueryFunctionContext<ReturnType<typeof queryKey>>]
287287
>()
288288
const onAbort = jest.fn()
@@ -339,7 +339,7 @@ describe('query', () => {
339339
test('should not continue if explicitly cancelled', async () => {
340340
const key = queryKey()
341341

342-
const queryFn = jest.fn()
342+
const queryFn = jest.fn<unknown, unknown[]>()
343343

344344
queryFn.mockImplementation(async () => {
345345
await sleep(10)
@@ -369,7 +369,7 @@ describe('query', () => {
369369
test('should not error if reset while loading', async () => {
370370
const key = queryKey()
371371

372-
const queryFn = jest.fn()
372+
const queryFn = jest.fn<unknown, unknown[]>()
373373

374374
queryFn.mockImplementation(async () => {
375375
await sleep(10)
@@ -399,7 +399,7 @@ describe('query', () => {
399399
test('should be able to refetch a cancelled query', async () => {
400400
const key = queryKey()
401401

402-
const queryFn = jest.fn()
402+
const queryFn = jest.fn<unknown, unknown[]>()
403403

404404
queryFn.mockImplementation(async () => {
405405
await sleep(50)
@@ -432,9 +432,12 @@ describe('query', () => {
432432
test('cancelling a rejected query should not have any effect', async () => {
433433
const key = queryKey()
434434

435-
await queryClient.prefetchQuery(key, async () => {
436-
throw new Error('error')
437-
})
435+
await queryClient.prefetchQuery(
436+
key,
437+
async (): Promise<unknown> => {
438+
throw new Error('error')
439+
}
440+
)
438441
const query = queryCache.find(key)!
439442
query.cancel()
440443
await sleep(10)
@@ -450,16 +453,20 @@ describe('query', () => {
450453
const query = queryCache.find(key)!
451454
expect(query.state.status).toBe('success')
452455

453-
await queryClient.prefetchQuery(key, () => Promise.reject('reject'), {
454-
retry: false,
455-
})
456+
await queryClient.prefetchQuery(
457+
key,
458+
() => Promise.reject<string>('reject'),
459+
{
460+
retry: false,
461+
}
462+
)
456463
expect(query.state.status).toBe('error')
457464

458465
queryClient.prefetchQuery(
459466
key,
460467
async () => {
461468
await sleep(10)
462-
return Promise.reject('reject')
469+
return Promise.reject<unknown>('reject')
463470
},
464471
{ retry: false }
465472
)

src/core/tests/queryCache.test.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,9 @@ describe('queryCache', () => {
175175
const onError = jest.fn()
176176
const testCache = new QueryCache({ onError })
177177
const testClient = createQueryClient({ queryCache: testCache })
178-
await testClient.prefetchQuery(key, () => Promise.reject('error'))
178+
await testClient.prefetchQuery(key, () =>
179+
Promise.reject<unknown>('error')
180+
)
179181
const query = testCache.find(key)
180182
expect(onError).toHaveBeenCalledWith('error', query)
181183
})

src/core/tests/queryClient.test.tsx

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -471,9 +471,12 @@ describe('queryClient', () => {
471471
const key = queryKey()
472472

473473
await expect(
474-
queryClient.fetchQuery(key, async () => {
475-
throw new Error('error')
476-
})
474+
queryClient.fetchQuery(
475+
key,
476+
async (): Promise<unknown> => {
477+
throw new Error('error')
478+
}
479+
)
477480
).rejects.toEqual(new Error('error'))
478481
})
479482

@@ -666,7 +669,7 @@ describe('queryClient', () => {
666669

667670
const result = await queryClient.prefetchQuery(
668671
key,
669-
async () => {
672+
async (): Promise<unknown> => {
670673
throw new Error('error')
671674
},
672675
{
@@ -724,7 +727,7 @@ describe('queryClient', () => {
724727
})
725728
try {
726729
await queryClient.fetchQuery(key2, async () => {
727-
return Promise.reject('err')
730+
return Promise.reject<unknown>('err')
728731
})
729732
} catch {}
730733
queryClient.fetchQuery(key1, async () => {
@@ -734,7 +737,7 @@ describe('queryClient', () => {
734737
try {
735738
queryClient.fetchQuery(key2, async () => {
736739
await sleep(1000)
737-
return Promise.reject('err2')
740+
return Promise.reject<unknown>('err2')
738741
})
739742
} catch {}
740743
queryClient.fetchQuery(key3, async () => {
@@ -783,7 +786,7 @@ describe('queryClient', () => {
783786
describe('refetchQueries', () => {
784787
test('should not refetch if all observers are disabled', async () => {
785788
const key = queryKey()
786-
const queryFn = jest.fn().mockReturnValue('data')
789+
const queryFn = jest.fn<string, unknown[]>().mockReturnValue('data')
787790
await queryClient.fetchQuery(key, queryFn)
788791
const observer1 = new QueryObserver(queryClient, {
789792
queryKey: key,
@@ -797,7 +800,7 @@ describe('queryClient', () => {
797800
})
798801
test('should refetch if at least one observer is enabled', async () => {
799802
const key = queryKey()
800-
const queryFn = jest.fn().mockReturnValue('data')
803+
const queryFn = jest.fn<string, unknown[]>().mockReturnValue('data')
801804
await queryClient.fetchQuery(key, queryFn)
802805
const observer1 = new QueryObserver(queryClient, {
803806
queryKey: key,
@@ -819,8 +822,8 @@ describe('queryClient', () => {
819822
test('should refetch all queries when no arguments are given', async () => {
820823
const key1 = queryKey()
821824
const key2 = queryKey()
822-
const queryFn1 = jest.fn().mockReturnValue('data1')
823-
const queryFn2 = jest.fn().mockReturnValue('data2')
825+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
826+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
824827
await queryClient.fetchQuery(key1, queryFn1)
825828
await queryClient.fetchQuery(key2, queryFn2)
826829
const observer1 = new QueryObserver(queryClient, {
@@ -845,8 +848,8 @@ describe('queryClient', () => {
845848
test('should be able to refetch all fresh queries', async () => {
846849
const key1 = queryKey()
847850
const key2 = queryKey()
848-
const queryFn1 = jest.fn().mockReturnValue('data1')
849-
const queryFn2 = jest.fn().mockReturnValue('data2')
851+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
852+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
850853
await queryClient.fetchQuery(key1, queryFn1)
851854
await queryClient.fetchQuery(key2, queryFn2)
852855
const observer = new QueryObserver(queryClient, {
@@ -864,8 +867,8 @@ describe('queryClient', () => {
864867
test('should be able to refetch all stale queries', async () => {
865868
const key1 = queryKey()
866869
const key2 = queryKey()
867-
const queryFn1 = jest.fn().mockReturnValue('data1')
868-
const queryFn2 = jest.fn().mockReturnValue('data2')
870+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
871+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
869872
await queryClient.fetchQuery(key1, queryFn1)
870873
await queryClient.fetchQuery(key2, queryFn2)
871874
const observer = new QueryObserver(queryClient, {
@@ -884,8 +887,8 @@ describe('queryClient', () => {
884887
test('should be able to refetch all stale and active queries', async () => {
885888
const key1 = queryKey()
886889
const key2 = queryKey()
887-
const queryFn1 = jest.fn().mockReturnValue('data1')
888-
const queryFn2 = jest.fn().mockReturnValue('data2')
890+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
891+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
889892
await queryClient.fetchQuery(key1, queryFn1)
890893
await queryClient.fetchQuery(key2, queryFn2)
891894
queryClient.invalidateQueries(key1)
@@ -906,8 +909,8 @@ describe('queryClient', () => {
906909
test('should be able to refetch all active and inactive queries', async () => {
907910
const key1 = queryKey()
908911
const key2 = queryKey()
909-
const queryFn1 = jest.fn().mockReturnValue('data1')
910-
const queryFn2 = jest.fn().mockReturnValue('data2')
912+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
913+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
911914
await queryClient.fetchQuery(key1, queryFn1)
912915
await queryClient.fetchQuery(key2, queryFn2)
913916
const observer = new QueryObserver(queryClient, {
@@ -925,8 +928,8 @@ describe('queryClient', () => {
925928
test('should be able to refetch all active and inactive queries', async () => {
926929
const key1 = queryKey()
927930
const key2 = queryKey()
928-
const queryFn1 = jest.fn().mockReturnValue('data1')
929-
const queryFn2 = jest.fn().mockReturnValue('data2')
931+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
932+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
930933
await queryClient.fetchQuery(key1, queryFn1)
931934
await queryClient.fetchQuery(key2, queryFn2)
932935
const observer = new QueryObserver(queryClient, {
@@ -944,8 +947,8 @@ describe('queryClient', () => {
944947
test('should be able to refetch only active queries', async () => {
945948
const key1 = queryKey()
946949
const key2 = queryKey()
947-
const queryFn1 = jest.fn().mockReturnValue('data1')
948-
const queryFn2 = jest.fn().mockReturnValue('data2')
950+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
951+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
949952
await queryClient.fetchQuery(key1, queryFn1)
950953
await queryClient.fetchQuery(key2, queryFn2)
951954
const observer = new QueryObserver(queryClient, {
@@ -963,8 +966,8 @@ describe('queryClient', () => {
963966
test('should be able to refetch only inactive queries', async () => {
964967
const key1 = queryKey()
965968
const key2 = queryKey()
966-
const queryFn1 = jest.fn().mockReturnValue('data1')
967-
const queryFn2 = jest.fn().mockReturnValue('data2')
969+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
970+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
968971
await queryClient.fetchQuery(key1, queryFn1)
969972
await queryClient.fetchQuery(key2, queryFn2)
970973
const observer = new QueryObserver(queryClient, {
@@ -981,7 +984,7 @@ describe('queryClient', () => {
981984

982985
test('should throw an error if throwOnError option is set to true', async () => {
983986
const key1 = queryKey()
984-
const queryFnError = () => Promise.reject('error')
987+
const queryFnError = () => Promise.reject<unknown>('error')
985988
try {
986989
await queryClient.fetchQuery({
987990
queryKey: key1,
@@ -1006,8 +1009,8 @@ describe('queryClient', () => {
10061009
test('should refetch active queries by default', async () => {
10071010
const key1 = queryKey()
10081011
const key2 = queryKey()
1009-
const queryFn1 = jest.fn().mockReturnValue('data1')
1010-
const queryFn2 = jest.fn().mockReturnValue('data2')
1012+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1013+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
10111014
await queryClient.fetchQuery(key1, queryFn1)
10121015
await queryClient.fetchQuery(key2, queryFn2)
10131016
const observer = new QueryObserver(queryClient, {
@@ -1025,8 +1028,8 @@ describe('queryClient', () => {
10251028
test('should not refetch inactive queries by default', async () => {
10261029
const key1 = queryKey()
10271030
const key2 = queryKey()
1028-
const queryFn1 = jest.fn().mockReturnValue('data1')
1029-
const queryFn2 = jest.fn().mockReturnValue('data2')
1031+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1032+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
10301033
await queryClient.fetchQuery(key1, queryFn1)
10311034
await queryClient.fetchQuery(key2, queryFn2)
10321035
const observer = new QueryObserver(queryClient, {
@@ -1044,8 +1047,8 @@ describe('queryClient', () => {
10441047
test('should not refetch active queries when "refetch" is "none"', async () => {
10451048
const key1 = queryKey()
10461049
const key2 = queryKey()
1047-
const queryFn1 = jest.fn().mockReturnValue('data1')
1048-
const queryFn2 = jest.fn().mockReturnValue('data2')
1050+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1051+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
10491052
await queryClient.fetchQuery(key1, queryFn1)
10501053
await queryClient.fetchQuery(key2, queryFn2)
10511054
const observer = new QueryObserver(queryClient, {
@@ -1065,8 +1068,8 @@ describe('queryClient', () => {
10651068
test('should refetch inactive queries when "refetch" is "inactive"', async () => {
10661069
const key1 = queryKey()
10671070
const key2 = queryKey()
1068-
const queryFn1 = jest.fn().mockReturnValue('data1')
1069-
const queryFn2 = jest.fn().mockReturnValue('data2')
1071+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1072+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
10701073
await queryClient.fetchQuery(key1, queryFn1)
10711074
await queryClient.fetchQuery(key2, queryFn2)
10721075
const observer = new QueryObserver(queryClient, {
@@ -1088,8 +1091,8 @@ describe('queryClient', () => {
10881091
test('should refetch active and inactive queries when "refetch" is "all"', async () => {
10891092
const key1 = queryKey()
10901093
const key2 = queryKey()
1091-
const queryFn1 = jest.fn().mockReturnValue('data1')
1092-
const queryFn2 = jest.fn().mockReturnValue('data2')
1094+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1095+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
10931096
await queryClient.fetchQuery(key1, queryFn1)
10941097
await queryClient.fetchQuery(key2, queryFn2)
10951098
const observer = new QueryObserver(queryClient, {
@@ -1216,8 +1219,8 @@ describe('queryClient', () => {
12161219
test('should refetch all active queries', async () => {
12171220
const key1 = queryKey()
12181221
const key2 = queryKey()
1219-
const queryFn1 = jest.fn().mockReturnValue('data1')
1220-
const queryFn2 = jest.fn().mockReturnValue('data2')
1222+
const queryFn1 = jest.fn<string, unknown[]>().mockReturnValue('data1')
1223+
const queryFn2 = jest.fn<string, unknown[]>().mockReturnValue('data2')
12211224
const observer1 = new QueryObserver(queryClient, {
12221225
queryKey: key1,
12231226
queryFn: queryFn1,

0 commit comments

Comments
 (0)