Skip to content

Commit 5562cfa

Browse files
fix(types): fix promise inference in useQueries (#3493)
* fix(types): handle Promise inference in useQueries * fix(types): prettier
1 parent 58a9fe9 commit 5562cfa

File tree

5 files changed

+28
-6
lines changed

5 files changed

+28
-6
lines changed

src/core/tests/query.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,8 @@ describe('query', () => {
803803

804804
const observer = new QueryObserver(queryClient, {
805805
queryKey: key,
806-
queryFn: (() => undefined) as any,
806+
// @ts-expect-error (queryFn must not return undefined)
807+
queryFn: () => undefined,
807808
retry: false,
808809
})
809810

src/core/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type QueryFunction<
1414
TQueryKey extends QueryKey = QueryKey
1515
> = (
1616
context: QueryFunctionContext<TQueryKey>
17-
) => QueryFunctionData<T> | Promise<QueryFunctionData<T>>
17+
) => QueryFunctionData<T | Promise<T>>
1818

1919
export interface QueryFunctionContext<
2020
TQueryKey extends QueryKey = QueryKey,

src/persistQueryClient/tests/PersistQueryClientProvider.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ describe('PersistQueryClientProvider', () => {
147147

148148
return (
149149
<div>
150-
<h1>{String(state.data)}</h1>
150+
<h1>{state.data}</h1>
151151
<h2>fetchStatus: {state.fetchStatus}</h2>
152152
</div>
153153
)

src/reactjs/tests/useQueries.test.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -776,8 +776,25 @@ describe('useQueries', () => {
776776
expectType<QueryObserverResult<string, unknown>>(result4[1])
777777
expectType<QueryObserverResult<number, unknown>>(result4[2])
778778

779-
// Array as const does not throw error
779+
// handles when queryFn returns a Promise
780780
const result5 = useQueries({
781+
queries: [
782+
{
783+
queryKey: key1,
784+
queryFn: () => Promise.resolve('string'),
785+
onSuccess: (a: string) => {
786+
expectType<string>(a)
787+
expectTypeNotAny(a)
788+
},
789+
// @ts-expect-error (refuses to accept a Promise)
790+
onSettled: (a: Promise<string>) => null,
791+
},
792+
],
793+
})
794+
expectType<QueryObserverResult<string, unknown>>(result5[0])
795+
796+
// Array as const does not throw error
797+
const result6 = useQueries({
781798
queries: [
782799
{
783800
queryKey: ['key1'],
@@ -789,8 +806,8 @@ describe('useQueries', () => {
789806
},
790807
],
791808
} as const)
792-
expectType<QueryObserverResult<string, unknown>>(result5[0])
793-
expectType<QueryObserverResult<number, unknown>>(result5[1])
809+
expectType<QueryObserverResult<string, unknown>>(result6[0])
810+
expectType<QueryObserverResult<number, unknown>>(result6[1])
794811

795812
// field names should be enforced - array literal
796813
useQueries({

src/reactjs/tests/useQuery.test.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ describe('useQuery', () => {
3838
expectType<unknown>(noQueryFn.data)
3939
expectType<unknown>(noQueryFn.error)
4040

41+
// it should not be possible for queryFn to return undefined
42+
// @ts-expect-error (queryFn returns undefined)
43+
useQuery(key, () => undefined)
44+
4145
// it should infer the result type from the query function
4246
const fromQueryFn = useQuery(key, () => 'test')
4347
expectType<string | undefined>(fromQueryFn.data)

0 commit comments

Comments
 (0)