diff --git a/.changeset/fix-persister-infer-when-queryfn-has-parameter.md b/.changeset/fix-persister-infer-when-queryfn-has-parameter.md new file mode 100644 index 0000000000..ef3ca442a3 --- /dev/null +++ b/.changeset/fix-persister-infer-when-queryfn-has-parameter.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-core': patch +--- + +fix(query-core): allow `persister` to contribute to `TQueryFnData` inference so a `queryFn` that declares a parameter no longer produces a spurious overload mismatch against a typed persister (#7842). diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index d36de200df..6e26b02746 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -246,11 +246,7 @@ export interface QueryOptions< */ gcTime?: number queryFn?: QueryFunction | SkipToken - persister?: QueryPersister< - NoInfer, - NoInfer, - NoInfer - > + persister?: QueryPersister queryHash?: string queryKey?: TQueryKey queryKeyHashFn?: QueryKeyHashFunction diff --git a/packages/react-query/src/__tests__/queryOptions.test-d.tsx b/packages/react-query/src/__tests__/queryOptions.test-d.tsx index dcfaeab658..14f92a8da3 100644 --- a/packages/react-query/src/__tests__/queryOptions.test-d.tsx +++ b/packages/react-query/src/__tests__/queryOptions.test-d.tsx @@ -15,6 +15,7 @@ import type { DataTag, InitialDataFunction, QueryObserverResult, + QueryPersister, } from '@tanstack/query-core' describe('queryOptions', () => { @@ -284,4 +285,40 @@ describe('queryOptions', () => { DataTag >() }) + + it('should infer TQueryFnData from persister paired with a queryFn declaring a parameter (#7842)', () => { + const persister = undefined as unknown as QueryPersister + + const options = queryOptions({ + queryKey: ['key'], + queryFn: (_context) => 'hello', + persister, + }) + + expectTypeOf(options.queryFn!).returns.toEqualTypeOf< + string | Promise + >() + }) + + it('should still error when persister and queryFn return types genuinely conflict', () => { + const persister = undefined as unknown as QueryPersister + + assertType( + queryOptions({ + queryKey: ['key'], + // @ts-expect-error persister expects string, queryFn returns number + queryFn: () => 42, + persister, + }), + ) + + assertType( + queryOptions({ + queryKey: ['key'], + // @ts-expect-error persister expects string, queryFn with arg returns number + queryFn: (_context) => 42, + persister, + }), + ) + }) })