From 775d072e8a2af9566b0b0250f61069aaed21d4a8 Mon Sep 17 00:00:00 2001 From: "shiwoo.park" Date: Wed, 16 Apr 2025 11:53:30 +0900 Subject: [PATCH 1/4] fix(query-core): fix setQueryData type inference in typed contexts --- packages/query-core/src/queryClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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, From 53a2d7934508b46c026f3a192c3ed0a75e15a7e0 Mon Sep 17 00:00:00 2001 From: "shiwoo.park" Date: Wed, 16 Apr 2025 11:53:58 +0900 Subject: [PATCH 2/4] test(query-core): add test case for setQueryData type inference in functions --- .../src/__tests__/queryClient.test-d.tsx | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) 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 + }) + } +}) From b5c6dde913b840066eee0ee60f7ae5835ee41aac Mon Sep 17 00:00:00 2001 From: "shiwoo.park" Date: Wed, 16 Apr 2025 12:17:54 +0900 Subject: [PATCH 3/4] fix(vue-query): fix setQueryData type inference in typed contexts --- packages/vue-query/src/queryClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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, From 7c34847bb101665a0ef9363b355b50be8c18cbaf Mon Sep 17 00:00:00 2001 From: "shiwoo.park" Date: Wed, 16 Apr 2025 12:20:19 +0900 Subject: [PATCH 4/4] test(vue-query): add test case for setQueryData type inference in functions --- .../vue-query/src/__tests__/queryClient.test-d.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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', () => {