From 47b7e95e1cd5b732613fb109233f7bda1d2f64ae Mon Sep 17 00:00:00 2001 From: Dominik Dorfmeister Date: Tue, 10 Oct 2023 12:46:11 +0200 Subject: [PATCH] fix(types): useSuspenseQuery can be in error state because we don't throw background errors to boundaries; still, it will always have data defined --- .../src/__tests__/suspense.types.test.tsx | 146 ++++++++++++++++++ packages/react-query/src/types.ts | 6 +- 2 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 packages/react-query/src/__tests__/suspense.types.test.tsx diff --git a/packages/react-query/src/__tests__/suspense.types.test.tsx b/packages/react-query/src/__tests__/suspense.types.test.tsx new file mode 100644 index 0000000000..d3b4098942 --- /dev/null +++ b/packages/react-query/src/__tests__/suspense.types.test.tsx @@ -0,0 +1,146 @@ +import { useSuspenseQuery } from '../useSuspenseQuery' +import { useSuspenseInfiniteQuery } from '../useSuspenseInfiniteQuery' +import { doNotExecute } from './utils' +import type { InfiniteData } from '@tanstack/query-core' +import type { Equal, Expect } from './utils' + +describe('useSuspenseQuery', () => { + it('should always have data defined', () => { + doNotExecute(() => { + const { data } = useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + }) + + const result: Expect> = true + return result + }) + }) + + it('should not have pending status', () => { + doNotExecute(() => { + const { status } = useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + }) + + const result: Expect> = true + return result + }) + }) + + it('should not allow placeholderData, enabled or throwOnError props', () => { + doNotExecute(() => { + useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + // @ts-expect-error TS2345 + placeholderData: 5, + enabled: true, + }) + + useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + // @ts-expect-error TS2345 + enabled: true, + }) + + useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + // @ts-expect-error TS2345 + throwOnError: true, + }) + }) + }) + + it('should not return isPlaceholderData', () => { + doNotExecute(() => { + const query = useSuspenseQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + }) + + // @ts-expect-error TS2339 + void query.isPlaceholderData + }) + }) +}) + +describe('useSuspenseInfiniteQuery', () => { + it('should always have data defined', () => { + doNotExecute(() => { + const { data } = useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + }) + + const result: Expect>> = + true + return result + }) + }) + + it('should not have pending status', () => { + doNotExecute(() => { + const { status } = useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + }) + + const result: Expect> = true + return result + }) + }) + + it('should not allow placeholderData, enabled or throwOnError props', () => { + doNotExecute(() => { + useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + // @ts-expect-error TS2345 + placeholderData: 5, + enabled: true, + }) + + useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + // @ts-expect-error TS2345 + enabled: true, + }) + + useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + // @ts-expect-error TS2345 + throwOnError: true, + }) + }) + }) + + it('should not return isPlaceholderData', () => { + doNotExecute(() => { + const query = useSuspenseInfiniteQuery({ + queryKey: ['key'], + queryFn: () => Promise.resolve(5), + initialPageParam: 1, + getNextPageParam: () => 1, + }) + + // @ts-expect-error TS2339 + void query.isPlaceholderData + }) + }) +}) diff --git a/packages/react-query/src/types.ts b/packages/react-query/src/types.ts index efbefe4df5..90587b871f 100644 --- a/packages/react-query/src/types.ts +++ b/packages/react-query/src/types.ts @@ -6,14 +6,12 @@ import type { DefinedQueryObserverResult, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, - InfiniteQueryObserverSuccessResult, MutateFunction, MutationObserverOptions, MutationObserverResult, QueryKey, QueryObserverOptions, QueryObserverResult, - QueryObserverSuccessResult, WithRequired, } from '@tanstack/query-core' @@ -105,7 +103,7 @@ export type UseQueryResult< export type UseSuspenseQueryResult< TData = unknown, TError = DefaultError, -> = Omit, 'isPlaceholderData'> +> = Omit, 'isPlaceholderData'> export type DefinedUseQueryResult< TData = unknown, @@ -125,7 +123,7 @@ export type DefinedUseInfiniteQueryResult< export type UseSuspenseInfiniteQueryResult< TData = unknown, TError = DefaultError, -> = Omit, 'isPlaceholderData'> +> = Omit, 'isPlaceholderData'> export interface UseMutationOptions< TData = unknown,