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

TypeScript中useQuery泛型any替换类型及TQueryFnData报错问题

解决useQuery泛型类型与TQueryFnData找不到的问题

问题说明

你现在用any作为useQuery的第一个泛型参数,等于放弃了TypeScript的类型检查优势。至于TQueryFnData找不到的问题,是因为它只是React Query内部类型定义里的泛型占位符,不是给开发者直接调用的类型,自然会报错。

正确写法示例

直接用你已经定义好的Users接口作为useQuery的第一个泛型参数(对应查询返回的数据类型),第二个参数填错误类型Error即可。另外注意userID可能为undefined,加个enabled选项避免发送无效请求:

import { useQuery } from '@tanstack/react-query';
import axios from 'axios';
import { Users } from './你的接口文件路径'; // 记得引入Users接口

export const useFetchUser = (userID: string | undefined) => {
    return useQuery<Users, Error>(
        ['fetchUser', userID], // 查询键
        () => axios.get(`https://jsonplaceholder.typicode.com/users/${userID}`)
            .then(response => response.data),
        {
            enabled: !!userID, // 仅当userID存在时执行查询
        }
    );
};

为啥TQueryFnData会报错

React Query的useQuery类型签名里的TQueryFnData只是个占位符,它的类型定义大致如下:

function useQuery<
  TQueryFnData = unknown,
  TError = unknown,
  TData = TQueryFnData,
  TQueryKey extends QueryKey = QueryKey
>(
  queryKey: TQueryKey,
  queryFn: QueryFunction<TQueryFnData, TQueryKey>,
  options?: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>
): UseQueryResult<TData, TError>;

你需要做的是把TQueryFnData替换成实际的返回类型(比如你的Users),而不是直接把TQueryFnData当作类型来使用。

额外补充

如果需要对返回的数据做结构转换,还可以用第三个泛型参数定义转换后的类型:

// 比如只提取用户的姓名和邮箱
type UserPreview = Pick<Users, 'name' | 'email'>;

export const useFetchUser = (userID: string | undefined) => {
    return useQuery<Users, Error, UserPreview>(
        ['fetchUser', userID],
        () => axios.get(`https://jsonplaceholder.typicode.com/users/${userID}`).then(res => res.data),
        {
            enabled: !!userID,
            select: (data) => ({ name: data.name, email: data.email }) // 转换返回数据结构
        }
    );
};

另外要保证Users和关联的Address、Geo、Company接口都完整定义,这样TypeScript才能正常进行类型校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:25:24