You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递React Infinite Query数据作为Props时的类型定义问题

React Query 无限查询下一页组件的类型简化方案

方案1:直接传递useInfiniteQuery完整返回结果

利用React Query内置的UseInfiniteQueryResult泛型类型,直接将查询结果对象作为Props传递给子组件,无需手动逐个定义类型:

父组件代码

import { useInfiniteQuery } from '@tanstack/react-query';

// 定义分页数据的业务类型
type Item = { id: number; name: string };
type ItemPage = { items: Item[]; nextPage: number | undefined };

const ItemList = () => {
  const queryResult = useInfiniteQuery({
    queryKey: ['items'],
    queryFn: async ({ pageParam = 0 }) => {
      const res = await fetch(`/api/items?page=${pageParam}`);
      return res.json() as Promise<ItemPage>;
    },
    getNextPageParam: (lastPage) => lastPage.nextPage,
  });

  return (
    <div>
      {/* 列表渲染逻辑 */}
      {queryResult.data?.pages.flatMap(page => page.items).map(item => (
        <div key={item.id}>{item.name}</div>
      ))}
      
      <NextPageButton queryResult={queryResult} />
    </div>
  );
};

子组件(下一页按钮)代码

import { UseInfiniteQueryResult } from '@tanstack/react-query';
import { ItemPage } from './ItemList';

type NextPageButtonProps = {
  queryResult: UseInfiniteQueryResult<ItemPage, Error>;
};

export const NextPageButton = ({ queryResult }: NextPageButtonProps) => {
  const { fetchNextPage, hasNextPage, isFetchingNextPage } = queryResult;

  return (
    <button
      onClick={() => fetchNextPage()}
      disabled={!hasNextPage || isFetchingNextPage}
      style={{ marginTop: '16px' }}
    >
      {isFetchingNextPage 
        ? '加载中...' 
        : hasNextPage 
          ? '下一页' 
          : '已加载全部'}
    </button>
  );
};

方案2:按需挑选所需属性(避免传递冗余数据)

如果不想传递完整的查询结果,可通过TypeScript的Pick工具类型,从UseInfiniteQueryResult中提取仅需的字段:

import { UseInfiniteQueryResult } from '@tanstack/react-query';
import { ItemPage } from './ItemList';

type NextPageButtonProps = Pick<
  UseInfiniteQueryResult<ItemPage, Error>,
  'fetchNextPage' | 'hasNextPage' | 'isFetchingNextPage'
>;

export const NextPageButton = ({ fetchNextPage, hasNextPage, isFetchingNextPage }: NextPageButtonProps) => {
  // 组件逻辑同上
};

方案3:提取父组件已推导的类型

若父组件中useInfiniteQuery的返回类型已自动推导完成,可直接通过typeof提取该类型并复用:

父组件中导出类型

// 在ItemList组件中导出查询结果的类型
export type ItemQueryResult = typeof queryResult;

子组件中使用

import { ItemQueryResult } from './ItemList';

type NextPageButtonProps = {
  queryResult: ItemQueryResult;
};

export const NextPageButton = ({ queryResult }: NextPageButtonProps) => {
  // 组件逻辑同上
};

以上三种方案都能避免手动重复定义React Query相关变量的类型,保证类型一致性的同时减少代码冗余。

内容的提问来源于stack exchange,提问作者Kristen Grote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:20:03