Skip to content

Commit 8f8e6d0

Browse files
fix(query-core, vue-query): fix type inference in setQueryData when used in functions with explicit return types (#9030)
* fix(query-core): fix setQueryData type inference in typed contexts * test(query-core): add test case for setQueryData type inference in functions * fix(vue-query): fix setQueryData type inference in typed contexts * test(vue-query): add test case for setQueryData type inference in functions
1 parent 4a5990e commit 8f8e6d0

File tree

4 files changed

+55
-4
lines changed

4 files changed

+55
-4
lines changed

packages/query-core/src/__tests__/queryClient.test-d.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ describe('setQueryData', () => {
113113

114114
expectTypeOf(data).toEqualTypeOf<string | undefined>()
115115
})
116+
117+
it('should preserve updater parameter type inference when used in functions with explicit return types', () => {
118+
const queryKey = ['key'] as DataTag<Array<string>, number>
119+
const queryClient = new QueryClient()
120+
121+
// Simulate usage inside a function with explicit return type
122+
// The outer function returns 'unknown' but this shouldn't affect the updater's type inference
123+
;(() =>
124+
queryClient.setQueryData(queryKey, (data) => {
125+
expectTypeOf(data).toEqualTypeOf<number | undefined>()
126+
return data
127+
})) satisfies () => unknown
128+
})
116129
})
117130

118131
describe('getQueryState', () => {
@@ -590,3 +603,28 @@ describe('resetQueries', () => {
590603
})
591604
})
592605
})
606+
type SuccessCallback = () => unknown
607+
it('should infer types correctly with expression body arrow functions', () => {
608+
const queryKey = ['key'] as DataTag<Array<string>, number>
609+
const queryClient = new QueryClient()
610+
611+
// @ts-expect-error
612+
const callbackTest: SuccessCallback = () =>
613+
queryClient.setQueryData(queryKey, (data) => {
614+
expectTypeOf(data).toEqualTypeOf<number | undefined>()
615+
return data
616+
})
617+
})
618+
619+
it('should infer types correctly with block body arrow functions', () => {
620+
const queryKey = ['key'] as DataTag<Array<string>, number>
621+
const queryClient = new QueryClient()
622+
623+
// @ts-expect-error
624+
const callbackTest2: SuccessCallback = () => {
625+
queryClient.setQueryData(queryKey, (data) => {
626+
expectTypeOf(data).toEqualTypeOf<number | undefined>()
627+
return data
628+
})
629+
}
630+
})

packages/query-core/src/queryClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export class QueryClient {
185185
NoInfer<TInferredQueryFnData> | undefined
186186
>,
187187
options?: SetDataOptions,
188-
): TInferredQueryFnData | undefined {
188+
): NoInfer<TInferredQueryFnData> | undefined {
189189
const defaultedOptions = this.defaultQueryOptions<
190190
any,
191191
any,

packages/vue-query/src/__tests__/queryClient.test-d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ describe('setQueryData', () => {
9696

9797
expectTypeOf(data).toEqualTypeOf<string | undefined>()
9898
})
99+
100+
it('should preserve updater parameter type inference when used in functions with explicit return types', () => {
101+
const queryKey = ['key'] as DataTag<Array<string>, number>
102+
const queryClient = new QueryClient()
103+
104+
// Simulate usage inside a function with explicit return type
105+
// The outer function returns 'unknown' but this shouldn't affect the updater's type inference
106+
;(() =>
107+
queryClient.setQueryData(queryKey, (data) => {
108+
expectTypeOf(data).toEqualTypeOf<number | undefined>()
109+
return data
110+
})) satisfies () => unknown
111+
})
99112
})
100113

101114
describe('fetchInfiniteQuery', () => {

packages/vue-query/src/queryClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,17 @@ export class QueryClient extends QC {
114114
NoInfer<TInferredQueryFnData> | undefined
115115
>,
116116
options?: MaybeRefDeep<SetDataOptions>,
117-
): TInferredQueryFnData | undefined
117+
): NoInfer<TInferredQueryFnData> | undefined
118118
setQueryData<TQueryFnData, TData = NoUnknown<TQueryFnData>>(
119119
queryKey: MaybeRefDeep<QueryKey>,
120120
updater: Updater<NoInfer<TData> | undefined, NoInfer<TData> | undefined>,
121121
options?: MaybeRefDeep<SetDataOptions>,
122-
): TData | undefined
122+
): NoInfer<TData> | undefined
123123
setQueryData<TData>(
124124
queryKey: MaybeRefDeep<QueryKey>,
125125
updater: Updater<TData | undefined, TData | undefined>,
126126
options: MaybeRefDeep<SetDataOptions> = {},
127-
): TData | undefined {
127+
): NoInfer<TData> | undefined {
128128
return super.setQueryData(
129129
cloneDeepUnref(queryKey),
130130
updater,

0 commit comments

Comments
 (0)