diff --git a/packages/react-query/src/__tests__/useQuery.test-d.tsx b/packages/react-query/src/__tests__/useQuery.test-d.tsx index fa104f5f92..f51e6ab4c7 100644 --- a/packages/react-query/src/__tests__/useQuery.test-d.tsx +++ b/packages/react-query/src/__tests__/useQuery.test-d.tsx @@ -293,6 +293,25 @@ describe('useQuery', () => { void result }) + // eslint-disable-next-line vitest/expect-expect + it('should preserve discriminated-union narrowing while keeping the reverse-inference guard', () => { + type Result = + | { type: 'first'; first: string } + | { type: 'second'; second: string } + + const query = useQuery({ + queryKey: queryKey(), + queryFn: (): Result => ({ type: 'first', first: 'a' }), + }) + + const second = query.data?.type === 'first' ? undefined : query.data + + expectTypeOf(second).toEqualTypeOf< + | { type: 'second'; second: string } + | undefined + >() + }) + it('data should not have undefined when initialData is provided', () => { const { data } = useQuery({ queryKey: queryKey(), diff --git a/packages/react-query/src/useQuery.ts b/packages/react-query/src/useQuery.ts index c0f2a6a840..6ef97c21cc 100644 --- a/packages/react-query/src/useQuery.ts +++ b/packages/react-query/src/useQuery.ts @@ -7,6 +7,8 @@ import type { UseQueryOptions, UseQueryResult, } from './types' + +type NarrowableNoInfer = T extends unknown ? NoInfer : never import type { DefinedInitialDataOptions, UndefinedInitialDataOptions, @@ -20,7 +22,7 @@ export function useQuery< >( options: DefinedInitialDataOptions, queryClient?: QueryClient, -): DefinedUseQueryResult, TError> +): DefinedUseQueryResult, TError> export function useQuery< TQueryFnData = unknown, @@ -30,7 +32,7 @@ export function useQuery< >( options: UndefinedInitialDataOptions, queryClient?: QueryClient, -): UseQueryResult, TError> +): UseQueryResult, TError> export function useQuery< TQueryFnData = unknown, @@ -40,7 +42,7 @@ export function useQuery< >( options: UseQueryOptions, queryClient?: QueryClient, -): UseQueryResult, TError> +): UseQueryResult, TError> export function useQuery(options: UseQueryOptions, queryClient?: QueryClient) { return useBaseQuery(options, QueryObserver, queryClient)