diff --git a/packages/query-core/src/__tests__/queryClient.test-d.tsx b/packages/query-core/src/__tests__/queryClient.test-d.tsx index e06d5829bd..c9d953a973 100644 --- a/packages/query-core/src/__tests__/queryClient.test-d.tsx +++ b/packages/query-core/src/__tests__/queryClient.test-d.tsx @@ -113,6 +113,19 @@ describe('setQueryData', () => { expectTypeOf(data).toEqualTypeOf() }) + + it('should preserve updater parameter type inference when used in functions with explicit return types', () => { + const queryKey = ['key'] as DataTag, number> + const queryClient = new QueryClient() + + // Simulate usage inside a function with explicit return type + // The outer function returns 'unknown' but this shouldn't affect the updater's type inference + ;(() => + queryClient.setQueryData(queryKey, (data) => { + expectTypeOf(data).toEqualTypeOf() + return data + })) satisfies () => unknown + }) }) describe('getQueryState', () => { @@ -590,3 +603,28 @@ describe('resetQueries', () => { }) }) }) +type SuccessCallback = () => unknown +it('should infer types correctly with expression body arrow functions', () => { + const queryKey = ['key'] as DataTag, number> + const queryClient = new QueryClient() + + // @ts-expect-error + const callbackTest: SuccessCallback = () => + queryClient.setQueryData(queryKey, (data) => { + expectTypeOf(data).toEqualTypeOf() + return data + }) +}) + +it('should infer types correctly with block body arrow functions', () => { + const queryKey = ['key'] as DataTag, number> + const queryClient = new QueryClient() + + // @ts-expect-error + const callbackTest2: SuccessCallback = () => { + queryClient.setQueryData(queryKey, (data) => { + expectTypeOf(data).toEqualTypeOf() + return data + }) + } +}) diff --git a/packages/query-core/src/queryClient.ts b/packages/query-core/src/queryClient.ts index ad920601fc..3406bbf7d2 100644 --- a/packages/query-core/src/queryClient.ts +++ b/packages/query-core/src/queryClient.ts @@ -185,7 +185,7 @@ export class QueryClient { NoInfer | undefined >, options?: SetDataOptions, - ): TInferredQueryFnData | undefined { + ): NoInfer | undefined { const defaultedOptions = this.defaultQueryOptions< any, any, diff --git a/packages/vue-query/src/__tests__/queryClient.test-d.ts b/packages/vue-query/src/__tests__/queryClient.test-d.ts index fbfdd02a7a..ae50680d34 100644 --- a/packages/vue-query/src/__tests__/queryClient.test-d.ts +++ b/packages/vue-query/src/__tests__/queryClient.test-d.ts @@ -96,6 +96,19 @@ describe('setQueryData', () => { expectTypeOf(data).toEqualTypeOf() }) + + it('should preserve updater parameter type inference when used in functions with explicit return types', () => { + const queryKey = ['key'] as DataTag, number> + const queryClient = new QueryClient() + + // Simulate usage inside a function with explicit return type + // The outer function returns 'unknown' but this shouldn't affect the updater's type inference + ;(() => + queryClient.setQueryData(queryKey, (data) => { + expectTypeOf(data).toEqualTypeOf() + return data + })) satisfies () => unknown + }) }) describe('fetchInfiniteQuery', () => { diff --git a/packages/vue-query/src/queryClient.ts b/packages/vue-query/src/queryClient.ts index ca0fe3953d..dc0bff131d 100644 --- a/packages/vue-query/src/queryClient.ts +++ b/packages/vue-query/src/queryClient.ts @@ -114,17 +114,17 @@ export class QueryClient extends QC { NoInfer | undefined >, options?: MaybeRefDeep, - ): TInferredQueryFnData | undefined + ): NoInfer | undefined setQueryData>( queryKey: MaybeRefDeep, updater: Updater | undefined, NoInfer | undefined>, options?: MaybeRefDeep, - ): TData | undefined + ): NoInfer | undefined setQueryData( queryKey: MaybeRefDeep, updater: Updater, options: MaybeRefDeep = {}, - ): TData | undefined { + ): NoInfer | undefined { return super.setQueryData( cloneDeepUnref(queryKey), updater,