diff --git a/packages/vue-query/src/__tests__/queryOptions.test-d.ts b/packages/vue-query/src/__tests__/queryOptions.test-d.ts index 8ee93aadcab..c40d606e862 100644 --- a/packages/vue-query/src/__tests__/queryOptions.test-d.ts +++ b/packages/vue-query/src/__tests__/queryOptions.test-d.ts @@ -122,4 +122,92 @@ describe('queryOptions', () => { expectTypeOf(data).toEqualTypeOf>() expectTypeOf(data2).toEqualTypeOf>() }) + + it('TData should always be defined when initialData is provided as a function which ALWAYS returns the data', () => { + const { data } = reactive( + useQuery( + queryOptions({ + queryKey: ['key'], + queryFn: () => { + return { + wow: true, + } + }, + initialData: () => ({ + wow: true, + }), + }), + ), + ) + + expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() + }) + + it('TData should have undefined in the union when initialData is NOT provided', () => { + const { data } = reactive( + useQuery( + queryOptions({ + queryKey: ['key'], + queryFn: () => { + return { + wow: true, + } + }, + }), + ), + ) + + expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + }) + + it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { + const { data } = reactive( + useQuery( + queryOptions({ + queryKey: ['key'], + queryFn: () => { + return { + wow: true, + } + }, + initialData: () => undefined as { wow: boolean } | undefined, + }), + ), + ) + + expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + }) + + it('TData should be narrowed after an isSuccess check when initialData is provided as a function which can return undefined', () => { + const { data, isSuccess } = reactive( + useQuery( + queryOptions({ + queryKey: ['key'], + queryFn: () => { + return { + wow: true, + } + }, + initialData: () => undefined as { wow: boolean } | undefined, + }), + ), + ) + + if (isSuccess) { + expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() + } + }) + + it('data should not have undefined when initialData is provided', () => { + const { data } = reactive( + useQuery( + queryOptions({ + queryKey: ['query-key'], + initialData: 42, + }), + ), + ) + + expectTypeOf(data).toEqualTypeOf() + }) }) diff --git a/packages/vue-query/src/__tests__/useQuery.test-d.ts b/packages/vue-query/src/__tests__/useQuery.test-d.ts index a02ee4b638c..3185a88957b 100644 --- a/packages/vue-query/src/__tests__/useQuery.test-d.ts +++ b/packages/vue-query/src/__tests__/useQuery.test-d.ts @@ -125,6 +125,17 @@ describe('useQuery', () => { expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() } }) + + it('data should not have undefined when initialData is provided', () => { + const { data } = reactive( + useQuery({ + queryKey: ['query-key'], + initialData: 42, + }), + ) + + expectTypeOf(data).toEqualTypeOf() + }) }) describe('custom composable', () => { diff --git a/packages/vue-query/src/queryOptions.ts b/packages/vue-query/src/queryOptions.ts index 558756c44f7..4681080f8ca 100644 --- a/packages/vue-query/src/queryOptions.ts +++ b/packages/vue-query/src/queryOptions.ts @@ -10,8 +10,8 @@ export function queryOptions< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: UndefinedInitialQueryOptions, -): UndefinedInitialQueryOptions & { + options: DefinedInitialQueryOptions, +): DefinedInitialQueryOptions & { queryKey: DataTag } @@ -21,8 +21,8 @@ export function queryOptions< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: DefinedInitialQueryOptions, -): DefinedInitialQueryOptions & { + options: UndefinedInitialQueryOptions, +): UndefinedInitialQueryOptions & { queryKey: DataTag } diff --git a/packages/vue-query/src/useQuery.ts b/packages/vue-query/src/useQuery.ts index 9ac47bd9531..fd60dee2ee5 100644 --- a/packages/vue-query/src/useQuery.ts +++ b/packages/vue-query/src/useQuery.ts @@ -3,6 +3,7 @@ import { useBaseQuery } from './useBaseQuery' import type { DefaultError, DefinedQueryObserverResult, + InitialDataFunction, QueryKey, QueryObserverOptions, } from '@tanstack/query-core' @@ -64,7 +65,10 @@ export type UndefinedInitialQueryOptions< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, > = UseQueryOptions & { - initialData?: undefined | (() => undefined) + initialData?: + | undefined + | InitialDataFunction> + | NonUndefinedGuard } export type DefinedInitialQueryOptions< @@ -95,9 +99,9 @@ export function useQuery< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: UndefinedInitialQueryOptions, + options: DefinedInitialQueryOptions, queryClient?: QueryClient, -): UseQueryReturnType +): UseQueryDefinedReturnType export function useQuery< TQueryFnData = unknown, @@ -105,9 +109,9 @@ export function useQuery< TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, >( - options: DefinedInitialQueryOptions, + options: UndefinedInitialQueryOptions, queryClient?: QueryClient, -): UseQueryDefinedReturnType +): UseQueryReturnType export function useQuery< TQueryFnData = unknown,