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

Typescript+React中使用useQuery出现QueryFunction类型不匹配报错如何解决

报错原因
  • 自定义的Param类型和React Query官方QueryFunction定义的入参类型不匹配。官方QueryFunction的入参是包含queryKey、pageParam、signal等属性的上下文对象,你自定义的Param类型未完整覆盖官方要求的类型字段,触发TypeScript静态类型校验报错。
  • 运行时功能正常是因为你实际只用到了上下文中确实存在的queryKey属性,类型校验不影响JS实际执行逻辑,所以请求和onSuccess回调都能正常运行。
修复方案

方案1:使用官方类型定义请求函数(推荐)

直接导入React Query内置的QueryFunction类型标注请求函数,不需要自定义Param类型:

// 导入官方类型
import { useQuery, QueryFunction } from '@tanstack/react-query';

// 给fetchFunction标注官方QueryFunction类型,泛型依次为返回值类型、queryKey类型
const fetchFunction: QueryFunction<IResponsePlanets, [string, { page: number }]> = async (param) => {
    const [key, { page }] = param.queryKey;
    const response = await fetch(`https://swapi.dev/api/planet/?page=${page}`);
    return response.json() as Promise<IResponsePlanets>;
};

方案2:修正自定义Param类型

如果需要保留自定义参数类型,继承官方的QueryFunctionContext即可:

import { useQuery, QueryFunctionContext } from '@tanstack/react-query';

// 继承官方上下文类型,自动匹配所有要求的属性
type Param = QueryFunctionContext<[string, { page: number }]>;

// 后续fetchFunction和原有逻辑保持不变即可
const fetchFunction = async (param: Param) => {
    const [key, { page }] = param.queryKey;
    const response = await fetch(`https://swapi.dev/api/planet/?page=${page}`);
    return response.json();
};

额外语法修正

你提供的useQuery调用代码末尾缺少右括号,修正后代码如下:

const { status, error, data } = useQuery<IResponsePlanets, Error>(["planets", { page: 1 }], fetchFunction, {
     staleTime: 5000,
     onSuccess: () => {
         console.log('working👍')
     }
});

内容的提问来源于stack exchange,提问作者Naveed Ali Rehmani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:54:04