From 00af50a4a08de12c99360991f4e1aa2fe6a84694 Mon Sep 17 00:00:00 2001 From: danieljayasurya-praathee Date: Wed, 25 Mar 2026 21:55:21 +0530 Subject: [PATCH] fix: infer pageParam from computed queryFn with conditional skipToken --- .../src/__tests__/useInfiniteQuery.test-d.tsx | 24 ++++++++++++++++++- packages/vue-query/src/useInfiniteQuery.ts | 13 ++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx b/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx index 9163cd2482e..89163728b16 100644 --- a/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx +++ b/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx @@ -1,6 +1,7 @@ import { describe, expectTypeOf, it } from 'vitest' -import { computed, reactive } from 'vue-demi' +import { computed, reactive, ref } from 'vue-demi' import { sleep } from '@tanstack/query-test-utils' +import { skipToken } from '..' import { useInfiniteQuery } from '../useInfiniteQuery' import { infiniteQueryOptions } from '../infiniteQueryOptions' import type { InfiniteData } from '@tanstack/query-core' @@ -127,4 +128,25 @@ describe('Discriminated union return type', () => { expectTypeOf(query.data).toEqualTypeOf>() } }) + + it('should infer pageParam from computed queryFn with conditional skipToken', () => { + const enabled = ref(false) + + useInfiniteQuery({ + queryKey: ['infiniteQuery', enabled], + queryFn: computed(() => + enabled.value + ? ({ pageParam }) => { + expectTypeOf(pageParam).toEqualTypeOf() + return sleep(0).then(() => 'Some data') + } + : skipToken, + ), + initialPageParam: 1, + getNextPageParam: (_lastPage, _allPages, lastPageParam) => { + expectTypeOf(lastPageParam).toEqualTypeOf() + return lastPageParam + 1 + }, + }) + }) }) diff --git a/packages/vue-query/src/useInfiniteQuery.ts b/packages/vue-query/src/useInfiniteQuery.ts index 107251df872..4c07abac8a3 100644 --- a/packages/vue-query/src/useInfiniteQuery.ts +++ b/packages/vue-query/src/useInfiniteQuery.ts @@ -9,6 +9,7 @@ import type { InfiniteData, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, + QueryFunction, QueryKey, QueryObserver, } from '@tanstack/query-core' @@ -24,6 +25,10 @@ import type { } from './types' import type { QueryClient } from './queryClient' +// Widen the type of the symbol to preserve contextual typing for +// `computed(() => condition ? queryFn : skipToken)`. +type SkipTokenForUseInfiniteQuery = symbol + export type UseInfiniteQueryOptions< TQueryFnData = unknown, TError = DefaultError, @@ -48,6 +53,14 @@ export type UseInfiniteQueryOptions< TPageParam >[Property] > + : Property extends 'queryFn' + ? MaybeRefOrGetter< + QueryFunction< + TQueryFnData, + DeepUnwrapRef, + TPageParam + > | SkipTokenForUseInfiniteQuery + > : MaybeRefDeep< InfiniteQueryObserverOptions< TQueryFnData,