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

使用TanStack Query时出现No overload matches this call错误求助

解决TanStack Query中"No overload matches this call"类型错误

问题根源

你在useQuery的queryFn中直接执行了getDataById(eventId),这会立即返回一个Promise,但TanStack Query要求queryFn是一个返回Promise的函数(即QueryFunction类型),而不是直接传入Promise实例,这就导致了类型不匹配的报错。

修复方案

1. 修正queryFn的传递方式

把直接调用改成传递一个箭头函数,让TanStack Query在需要时才执行数据获取逻辑:

"use client";

import { getDataById } from "@/data-query/appointment";
import { useQuery } from "@tanstack/react-query";
import { useParams } from "next/navigation";
import React from "react";

export default function EventPageDetail() {
  const { eventId } = useParams();

  // 改为箭头函数包裹,传递函数而非直接执行后的Promise
  const { data, error, isFetching } = useQuery({
    queryKey: ["eventId", eventId],
    queryFn: () => getDataById(eventId),
    // 可选:eventId不存在时禁用查询,避免无效调用
    enabled: !!eventId,
  });

  return <div></div>;
}

2. 优化类型定义(推荐)

避免使用any,明确类型可以减少后续类型错误:

服务端action代码优化

// 假设数据库id类型为string,根据实际情况调整
export async function getDataById(id: string) {
  try {
    const data = await db.appoinmentSchedule.findUnique({
      where: { id },
    });

    return data;
  } catch (error) {
    // 抛出错误而非返回错误对象,让TanStack Query的error字段正确捕获异常
    throw new Error("Something went wrong");
  }
}

3. 处理useParams的类型

useParams()返回的参数可能是string | string[] | undefined,可以添加类型判断确保id有效:

const { eventId } = useParams();
// 过滤出有效的string类型id
const validEventId = typeof eventId === "string" ? eventId : "";

const { data, error, isFetching } = useQuery({
  queryKey: ["eventId", validEventId],
  queryFn: () => getDataById(validEventId),
  enabled: !!validEventId,
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:27