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

TypeScript中useQuery必填变量依赖查询结果的类型报错问题

解决React Query必填变量类型不匹配的问题

嘿,这个React Query结合TypeScript的类型问题我太熟了!给你几个实用的解决思路,你可以根据自己的场景选:

方法一:非空断言(简单直接,需确保逻辑安全)

既然你已经通过skip: !myVariable确保了只有变量存在时才执行第二个查询,那可以用非空断言!明确告诉TypeScript:这个变量此时肯定是number类型,不会是undefined:

const { data: secondQueryData } = useQuery(GET_MY_SECOND_QUERY_DATA, { 
  variables: { secondVariable: myVariable! }, // 非空断言排除undefined类型
  skip: !myVariable 
})

⚠️ 注意:只有当你能100%保证skip的判断逻辑和变量的存在性完全一致时才用这个方法,不然可能会触发运行时错误。

方法二:条件拆分逻辑(类型安全,可读性强)

把第二个查询的创建逻辑放在if判断里,让TypeScript自动推断变量类型:

let secondQueryData: typeof secondQueryData | undefined;

if (myVariable) {
  // 这里TypeScript会自动推断myVariable是number类型
  const { data } = useQuery(GET_MY_SECOND_QUERY_DATA, { 
    variables: { secondVariable: myVariable } 
  });
  secondQueryData = data;
}

这种方式完全符合TypeScript的类型检查规则,不会有报错,逻辑也更直观——变量存在才发起查询,不存在就跳过。

方法三:自定义类型安全的useQuery(进阶方案)

如果你的项目里经常遇到这种场景,可以封装一个自定义的useQuery,强制要求当skip为false时,变量必须是必填的非undefined类型:

import { useQuery as useTanstackQuery, QueryKey, UseQueryOptions } from '@tanstack/react-query';

function useQuery<TQueryFnData, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(
  queryKey: TQueryKey,
  options: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'variables'> & {
    variables: NonNullable<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>['variables']>;
    skip?: boolean;
  }
) {
  return useTanstackQuery(queryKey, {
    ...options,
    variables: options.skip ? undefined : options.variables,
  });
}

之后用这个自定义的useQuery,只要skip为false,TypeScript就会强制要求variables是必填的合法类型,从根源上避免这类报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:42:30