Skip to content

Commit 9dc3eaa

Browse files
authored
fix(query-core): computed properties of QueryObserverResult (TanStack#6716)
* fix: computed type from QueryObserverResult * test: add test cases for QueryObserverResult * test: add test cases for InfiniteQueryObserverResult
1 parent 1ead251 commit 9dc3eaa

File tree

3 files changed

+128
-3
lines changed

3 files changed

+128
-3
lines changed

packages/query-core/src/tests/infiniteQueryObserver.test.tsx

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1-
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
1+
import {
2+
afterEach,
3+
beforeEach,
4+
describe,
5+
expect,
6+
expectTypeOf,
7+
test,
8+
vi,
9+
} from 'vitest'
210
import { InfiniteQueryObserver } from '..'
311
import { createQueryClient, queryKey, sleep } from './utils'
4-
import type { QueryClient } from '..'
12+
import type { InfiniteData, QueryClient } from '..'
513

614
describe('InfiniteQueryObserver', () => {
715
let queryClient: QueryClient
@@ -156,4 +164,45 @@ describe('InfiniteQueryObserver', () => {
156164
expect(queryFn).toBeCalledTimes(3)
157165
expect(observer.getCurrentResult().hasNextPage).toBe(false)
158166
})
167+
168+
test('should be inferred as a correct result type', async () => {
169+
const key = queryKey()
170+
const next: number | undefined = 2
171+
const queryFn = vi.fn(({ pageParam }) => String(pageParam))
172+
const observer = new InfiniteQueryObserver(queryClient, {
173+
queryKey: key,
174+
queryFn,
175+
initialPageParam: 1,
176+
getNextPageParam: () => next,
177+
})
178+
179+
const result = observer.getCurrentResult()
180+
181+
result.isPending &&
182+
expectTypeOf<undefined>(result.data) &&
183+
expectTypeOf<null>(result.error) &&
184+
expectTypeOf<boolean>(result.isLoading) &&
185+
expectTypeOf<'pending'>(result.status)
186+
187+
result.isLoading &&
188+
expectTypeOf<undefined>(result.data) &&
189+
expectTypeOf<null>(result.error) &&
190+
expectTypeOf<true>(result.isPending) &&
191+
expectTypeOf<'pending'>(result.status)
192+
193+
result.isLoadingError &&
194+
expectTypeOf<undefined>(result.data) &&
195+
expectTypeOf<Error>(result.error) &&
196+
expectTypeOf<'error'>(result.status)
197+
198+
result.isRefetchError &&
199+
expectTypeOf<InfiniteData<string>>(result.data) &&
200+
expectTypeOf<Error>(result.error) &&
201+
expectTypeOf<'error'>(result.status)
202+
203+
result.isSuccess &&
204+
expectTypeOf<InfiniteData<string>>(result.data) &&
205+
expectTypeOf<null>(result.error) &&
206+
expectTypeOf<'success'>(result.status)
207+
})
159208
})

packages/query-core/src/tests/queryObserver.test.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,4 +894,42 @@ describe('queryObserver', () => {
894894

895895
unsubscribe()
896896
})
897+
898+
test('should be inferred as a correct result type', async () => {
899+
const key = queryKey()
900+
const data = { value: 'data' }
901+
const observer = new QueryObserver(queryClient, {
902+
queryKey: key,
903+
queryFn: () => Promise.resolve(data),
904+
})
905+
906+
const result = observer.getCurrentResult()
907+
908+
result.isPending &&
909+
expectTypeOf<undefined>(result.data) &&
910+
expectTypeOf<null>(result.error) &&
911+
expectTypeOf<boolean>(result.isLoading) &&
912+
expectTypeOf<'pending'>(result.status)
913+
914+
result.isLoading &&
915+
expectTypeOf<undefined>(result.data) &&
916+
expectTypeOf<null>(result.error) &&
917+
expectTypeOf<true>(result.isPending) &&
918+
expectTypeOf<'pending'>(result.status)
919+
920+
result.isLoadingError &&
921+
expectTypeOf<undefined>(result.data) &&
922+
expectTypeOf<Error>(result.error) &&
923+
expectTypeOf<'error'>(result.status)
924+
925+
result.isRefetchError &&
926+
expectTypeOf<{ value: string }>(result.data) &&
927+
expectTypeOf<Error>(result.error) &&
928+
expectTypeOf<'error'>(result.status)
929+
930+
result.isSuccess &&
931+
expectTypeOf<{ value: string }>(result.data) &&
932+
expectTypeOf<null>(result.error) &&
933+
expectTypeOf<'success'>(result.status)
934+
})
897935
})

packages/query-core/src/types.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,20 @@ export interface QueryObserverBaseResult<
488488
fetchStatus: FetchStatus
489489
}
490490

491+
export interface QueryObserverPendingResult<
492+
TData = unknown,
493+
TError = DefaultError,
494+
> extends QueryObserverBaseResult<TData, TError> {
495+
data: undefined
496+
error: null
497+
isError: false
498+
isPending: true
499+
isLoadingError: false
500+
isRefetchError: false
501+
isSuccess: false
502+
status: 'pending'
503+
}
504+
491505
export interface QueryObserverLoadingResult<
492506
TData = unknown,
493507
TError = DefaultError,
@@ -496,6 +510,7 @@ export interface QueryObserverLoadingResult<
496510
error: null
497511
isError: false
498512
isPending: true
513+
isLoading: true
499514
isLoadingError: false
500515
isRefetchError: false
501516
isSuccess: false
@@ -510,6 +525,7 @@ export interface QueryObserverLoadingErrorResult<
510525
error: TError
511526
isError: true
512527
isPending: false
528+
isLoading: false
513529
isLoadingError: true
514530
isRefetchError: false
515531
isSuccess: false
@@ -524,6 +540,7 @@ export interface QueryObserverRefetchErrorResult<
524540
error: TError
525541
isError: true
526542
isPending: false
543+
isLoading: false
527544
isLoadingError: false
528545
isRefetchError: true
529546
isSuccess: false
@@ -538,6 +555,7 @@ export interface QueryObserverSuccessResult<
538555
error: null
539556
isError: false
540557
isPending: false
558+
isLoading: false
541559
isLoadingError: false
542560
isRefetchError: false
543561
isSuccess: true
@@ -555,6 +573,7 @@ export type QueryObserverResult<TData = unknown, TError = DefaultError> =
555573
| DefinedQueryObserverResult<TData, TError>
556574
| QueryObserverLoadingErrorResult<TData, TError>
557575
| QueryObserverLoadingResult<TData, TError>
576+
| QueryObserverPendingResult<TData, TError>
558577

559578
export interface InfiniteQueryObserverBaseResult<
560579
TData = unknown,
@@ -572,6 +591,20 @@ export interface InfiniteQueryObserverBaseResult<
572591
isFetchingPreviousPage: boolean
573592
}
574593

594+
export interface InfiniteQueryObserverPendingResult<
595+
TData = unknown,
596+
TError = DefaultError,
597+
> extends InfiniteQueryObserverBaseResult<TData, TError> {
598+
data: undefined
599+
error: null
600+
isError: false
601+
isPending: true
602+
isLoadingError: false
603+
isRefetchError: false
604+
isSuccess: false
605+
status: 'pending'
606+
}
607+
575608
export interface InfiniteQueryObserverLoadingResult<
576609
TData = unknown,
577610
TError = DefaultError,
@@ -580,6 +613,7 @@ export interface InfiniteQueryObserverLoadingResult<
580613
error: null
581614
isError: false
582615
isPending: true
616+
isLoading: true
583617
isLoadingError: false
584618
isRefetchError: false
585619
isSuccess: false
@@ -594,6 +628,7 @@ export interface InfiniteQueryObserverLoadingErrorResult<
594628
error: TError
595629
isError: true
596630
isPending: false
631+
isLoading: false
597632
isLoadingError: true
598633
isRefetchError: false
599634
isSuccess: false
@@ -608,6 +643,7 @@ export interface InfiniteQueryObserverRefetchErrorResult<
608643
error: TError
609644
isError: true
610645
isPending: false
646+
isLoading: false
611647
isLoadingError: false
612648
isRefetchError: true
613649
isSuccess: false
@@ -622,6 +658,7 @@ export interface InfiniteQueryObserverSuccessResult<
622658
error: null
623659
isError: false
624660
isPending: false
661+
isLoading: false
625662
isLoadingError: false
626663
isRefetchError: false
627664
isSuccess: true
@@ -639,9 +676,10 @@ export type InfiniteQueryObserverResult<
639676
TData = unknown,
640677
TError = DefaultError,
641678
> =
679+
| DefinedInfiniteQueryObserverResult<TData, TError>
642680
| InfiniteQueryObserverLoadingErrorResult<TData, TError>
643681
| InfiniteQueryObserverLoadingResult<TData, TError>
644-
| DefinedInfiniteQueryObserverResult<TData, TError>
682+
| InfiniteQueryObserverPendingResult<TData, TError>
645683

646684
export type MutationKey = ReadonlyArray<unknown>
647685

0 commit comments

Comments
 (0)