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

TanStack Query中useQuery的类型收窄为何不生效?

TanStack Query useQuery isSuccess 类型收窄失效的解决办法

你遇到的问题是:使用TanStack Query的useQuery时,即便判断了isSuccess为true,data的类型依然是number | undefined,无法自动收窄为number。

问题原因

TypeScript无法将独立的isSuccess变量和data的类型做关联——这两个是返回对象中分开的属性,并非互斥的联合类型成员,所以编译器没法推断当isSuccess为true时,data一定存在有效值。

解决办法

  • 直接判断data的存在性(推荐)
    既然isSuccess为true时data必然有值,反过来只要data存在,就说明请求已成功。直接判断data本身,TypeScript能正确收窄类型:

    const { data, isSuccess } = useQuery(["test"], () => Promise.resolve(5));
    
    if (data) {
      // 此处data类型自动收窄为number
      data;  
    }
    
  • 结合isSuccess使用非空断言(谨慎使用)
    如果你一定要基于isSuccess判断,可以用非空断言!强制告诉TypeScriptdata此时非空,但这种方式跳过了类型检查,若后续逻辑变动可能引发运行时错误:

    const { data, isSuccess } = useQuery(["test"], () => Promise.resolve(5));
    
    if (isSuccess) {
      // 非空断言后,safeData类型为number
      const safeData = data!;
    }
    
  • 自定义类型守卫(灵活场景)
    写一个自定义类型守卫函数,将isSuccess和data的类型做关联,让TypeScript能正确识别:

    function hasQueryData<T>(result: { isSuccess: boolean; data: T | undefined }): result is { isSuccess: true; data: T } {
      return result.isSuccess && result.data !== undefined;
    }
    
    // 使用示例
    const queryResult = useQuery(["test"], () => Promise.resolve(5));
    if (hasQueryData(queryResult)) {
      // 此处queryResult.data类型为number
      queryResult.data;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:45:35