From 16798cd57ad8822855411273139b552f087a76e1 Mon Sep 17 00:00:00 2001 From: gujishh Date: Fri, 3 Jul 2026 12:16:07 +0900 Subject: [PATCH] fix(react-query): preserve narrowing with NoInfer --- .../src/__tests__/useQuery.test-d.tsx | 19 +++++++++++++++++++ packages/react-query/src/useQuery.ts | 8 +++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/react-query/src/__tests__/useQuery.test-d.tsx b/packages/react-query/src/__tests__/useQuery.test-d.tsx index fa104f5f922..f51e6ab4c70 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 c0f2a6a8404..6ef97c21ccf 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)