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..476fed53fb6 100644 --- a/packages/vue-query/src/useInfiniteQuery.ts +++ b/packages/vue-query/src/useInfiniteQuery.ts @@ -9,8 +9,10 @@ import type { InfiniteData, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, + QueryFunction, QueryKey, QueryObserver, + SkipToken, } from '@tanstack/query-core' import type { UseBaseQueryReturnType } from './useBaseQuery' @@ -24,6 +26,9 @@ import type { } from './types' import type { QueryClient } from './queryClient' +// Widen the type of the symbol to preserve contextual typing for +// `computed(() => condition ? queryFn : skipToken)`. + export type UseInfiniteQueryOptions< TQueryFnData = unknown, TError = DefaultError, @@ -48,15 +53,20 @@ export type UseInfiniteQueryOptions< TPageParam >[Property] > - : MaybeRefDeep< - InfiniteQueryObserverOptions< - TQueryFnData, - TError, - TData, - DeepUnwrapRef, - TPageParam - >[Property] - > + : Property extends 'queryFn' + ? MaybeRefOrGetter< + | QueryFunction, TPageParam> + | SkipToken + > + : MaybeRefDeep< + InfiniteQueryObserverOptions< + TQueryFnData, + TError, + TData, + DeepUnwrapRef, + TPageParam + >[Property] + > } & ShallowOption >