Skip to content

feat(select): defer TData inference #5040

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
4 changes: 2 additions & 2 deletions packages/query-core/src/infiniteQueryObserver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ type InfiniteQueryObserverListener<TData, TError> = (
export class InfiniteQueryObserver<
TQueryFnData = unknown,
TError = RegisteredError,
TData = TQueryFnData,
TData = InfiniteData<TQueryFnData>,
TQueryData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> extends QueryObserver<
TQueryFnData,
TError,
InfiniteData<TData>,
TData,
InfiniteData<TQueryData>,
TQueryKey
> {
Expand Down
8 changes: 4 additions & 4 deletions packages/query-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ export interface InfiniteQueryObserverOptions<
> extends QueryObserverOptions<
TQueryFnData,
TError,
InfiniteData<TData>,
TData,
InfiniteData<TQueryData>,
TQueryKey,
TPageParam
Expand Down Expand Up @@ -501,7 +501,7 @@ export type QueryObserverResult<TData = unknown, TError = RegisteredError> =
export interface InfiniteQueryObserverBaseResult<
TData = unknown,
TError = RegisteredError,
> extends QueryObserverBaseResult<InfiniteData<TData>, TError> {
> extends QueryObserverBaseResult<TData, TError> {
fetchNextPage: (
options?: FetchNextPageOptions,
) => Promise<InfiniteQueryObserverResult<TData, TError>>
Expand Down Expand Up @@ -546,7 +546,7 @@ export interface InfiniteQueryObserverRefetchErrorResult<
TData = unknown,
TError = RegisteredError,
> extends InfiniteQueryObserverBaseResult<TData, TError> {
data: InfiniteData<TData>
data: TData
error: TError
isError: true
isPending: false
Expand All @@ -560,7 +560,7 @@ export interface InfiniteQueryObserverSuccessResult<
TData = unknown,
TError = RegisteredError,
> extends InfiniteQueryObserverBaseResult<TData, TError> {
data: InfiniteData<TData>
data: TData
error: null
isError: false
isPending: false
Expand Down
4 changes: 2 additions & 2 deletions packages/react-query/src/__tests__/suspense.test.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { fireEvent, waitFor } from '@testing-library/react'
import * as React from 'react'
import { ErrorBoundary } from 'react-error-boundary'
import type { UseInfiniteQueryResult, UseQueryResult } from '..'
import type { InfiniteData, UseInfiniteQueryResult, UseQueryResult } from '..'
import {
QueryCache,
QueryErrorResetBoundary,
Expand Down Expand Up @@ -68,7 +68,7 @@ describe("useQuery's in Suspense mode", () => {

it('should return the correct states for a successful infinite query', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const [multiplier, setMultiplier] = React.useState(1)
Expand Down
32 changes: 17 additions & 15 deletions packages/react-query/src/__tests__/useInfiniteQuery.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ describe('useInfiniteQuery', () => {

it('should return the correct states for a successful query', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -172,7 +172,7 @@ describe('useInfiniteQuery', () => {

it('should keep the previous data when placeholderData is set', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<string>[] = []
const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const [order, setOrder] = React.useState('desc')
Expand Down Expand Up @@ -268,7 +268,7 @@ describe('useInfiniteQuery', () => {

it('should be able to select a part of the data', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<string>[] = []
const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -305,7 +305,9 @@ describe('useInfiniteQuery', () => {

it('should be able to select a new result and not cause infinite renders', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<{ count: number; id: number }>[] = []
const states: UseInfiniteQueryResult<
InfiniteData<{ count: number; id: number }>
>[] = []
let selectCalled = 0

function Page() {
Expand Down Expand Up @@ -353,7 +355,7 @@ describe('useInfiniteQuery', () => {

it('should be able to reverse the data', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -410,7 +412,7 @@ describe('useInfiniteQuery', () => {

it('should be able to fetch a previous page', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -493,7 +495,7 @@ describe('useInfiniteQuery', () => {

it('should be able to refetch when providing page params automatically', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -602,7 +604,7 @@ describe('useInfiniteQuery', () => {

it('should silently cancel any ongoing fetch when fetching more', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -821,7 +823,7 @@ describe('useInfiniteQuery', () => {

it('should keep fetching first page when not loaded yet and triggering fetch more', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -920,7 +922,7 @@ describe('useInfiniteQuery', () => {

it('should be able to set new pages with the query client', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const [firstPage, setFirstPage] = React.useState(0)
Expand Down Expand Up @@ -1002,7 +1004,7 @@ describe('useInfiniteQuery', () => {

it('should only refetch the first page when initialData is provided', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -1067,7 +1069,7 @@ describe('useInfiniteQuery', () => {

it('should set hasNextPage to false if getNextPageParam returns undefined', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -1105,7 +1107,7 @@ describe('useInfiniteQuery', () => {

it('should compute hasNextPage correctly using initialData', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -1144,7 +1146,7 @@ describe('useInfiniteQuery', () => {

it('should compute hasNextPage correctly for falsy getFetchMore return value using initialData', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<number>[] = []
const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down Expand Up @@ -1183,7 +1185,7 @@ describe('useInfiniteQuery', () => {

it('should not use selected data when computing hasNextPage', async () => {
const key = queryKey()
const states: UseInfiniteQueryResult<string>[] = []
const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const state = useInfiniteQuery({
Expand Down
22 changes: 20 additions & 2 deletions packages/react-query/src/__tests__/useInfiniteQuery.type.test.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { InfiniteData } from '@tanstack/query-core'
import { QueryClient } from '@tanstack/query-core'
import { useInfiniteQuery } from '../useInfiniteQuery'
import { useQuery } from '../useQuery'
import type { Expect, Equal } from './utils'
import { doNotExecute } from './utils'
import type { InfiniteData } from '@tanstack/query-core'
import { QueryClient } from '@tanstack/query-core'

describe('pageParam', () => {
it('defaultPageParam should define type of param passed to queryFunctionContext', () => {
Expand Down Expand Up @@ -62,6 +62,24 @@ describe('pageParam', () => {
})

describe('select', () => {
it('should still return paginated data if no select result', () => {
doNotExecute(() => {
const infiniteQuery = useInfiniteQuery({
queryKey: ['key'],
queryFn: ({ pageParam }) => {
return pageParam * 5
},
defaultPageParam: 1,
getNextPageParam: () => undefined,
})

const result: Expect<
Equal<InfiniteData<number> | undefined, (typeof infiniteQuery)['data']>
> = true
return result
})
})

it('should be able to transform data to arbitrary result', () => {
doNotExecute(() => {
const infiniteQuery = useInfiniteQuery({
Expand Down
3 changes: 2 additions & 1 deletion packages/react-query/src/useInfiniteQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type {
QueryKey,
QueryClient,
RegisteredError,
InfiniteData,
} from '@tanstack/query-core'
import { InfiniteQueryObserver } from '@tanstack/query-core'
import type { UseInfiniteQueryOptions, UseInfiniteQueryResult } from './types'
Expand All @@ -12,7 +13,7 @@ import { useBaseQuery } from './useBaseQuery'
export function useInfiniteQuery<
TQueryFnData,
TError = RegisteredError,
TData = TQueryFnData,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
>(
Expand Down
33 changes: 17 additions & 16 deletions packages/solid-query/src/__tests__/createInfiniteQuery.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ describe('useInfiniteQuery', () => {

it('should return the correct states for a successful query', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -191,7 +191,7 @@ describe('useInfiniteQuery', () => {

it('should keep the previous data when placeholderData is set', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<string>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const [order, setOrder] = createSignal('desc')
Expand Down Expand Up @@ -286,7 +286,7 @@ describe('useInfiniteQuery', () => {

it('should be able to select a part of the data', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<string>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -326,8 +326,9 @@ describe('useInfiniteQuery', () => {

it('should be able to select a new result and not cause infinite renders', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<{ count: number; id: number }>[] =
[]
const states: CreateInfiniteQueryResult<
InfiniteData<{ count: number; id: number }>
>[] = []
let selectCalled = 0

function Page() {
Expand Down Expand Up @@ -372,7 +373,7 @@ describe('useInfiniteQuery', () => {

it('should be able to reverse the data', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -436,7 +437,7 @@ describe('useInfiniteQuery', () => {

it('should be able to fetch a previous page', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -515,7 +516,7 @@ describe('useInfiniteQuery', () => {

it('should be able to refetch when providing page params automatically', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -629,7 +630,7 @@ describe('useInfiniteQuery', () => {

it('should silently cancel any ongoing fetch when fetching more', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -865,7 +866,7 @@ describe('useInfiniteQuery', () => {

it('should keep fetching first page when not loaded yet and triggering fetch more', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const start = 10
Expand Down Expand Up @@ -975,7 +976,7 @@ describe('useInfiniteQuery', () => {

it('should be able to set new pages with the query client', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const [firstPage, setFirstPage] = createSignal(0)
Expand Down Expand Up @@ -1063,7 +1064,7 @@ describe('useInfiniteQuery', () => {

it('should only refetch the first page when initialData is provided', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -1134,7 +1135,7 @@ describe('useInfiniteQuery', () => {

it('should set hasNextPage to false if getNextPageParam returns undefined', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -1178,7 +1179,7 @@ describe('useInfiniteQuery', () => {

it('should compute hasNextPage correctly using initialData', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -1222,7 +1223,7 @@ describe('useInfiniteQuery', () => {

it('should compute hasNextPage correctly for falsy getFetchMore return value using initialData', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<number>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down Expand Up @@ -1266,7 +1267,7 @@ describe('useInfiniteQuery', () => {

it('should not use selected data when computing hasNextPage', async () => {
const key = queryKey()
const states: CreateInfiniteQueryResult<string>[] = []
const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []

function Page() {
const state = createInfiniteQuery(() => ({
Expand Down
Loading