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

TanStack Query中queryKey含undefined的TypeScript问题咨询

解决React Query中username可选类型的TypeScript错误问题

可行方案

结合React Query的enabled配置控制查询触发时机,同时通过类型处理确保fetchUser的参数合法性,无需修改fetchUser的参数类型:

方案1:非空断言(简洁高效)

利用enabled配置保证queryFn仅在username存在时执行,此时可以安全使用非空断言消除TS错误:

interface Props {
  username: string | undefined
}

const fetchUser = (username: string): Promise<Object> => Promise.resolve({})

export function UserCard({ username }: Props) {
  const { data, isLoading } = useQuery(
    ['markets', username],
    // 因enabled控制,此时username必然为string,可安全断言
    () => fetchUser(username!), 
    {
      // 仅当username存在时触发查询
      enabled: !!username,
      select: (data: Object): Object => {
        // 你的数据转换逻辑
        return data
      },
    }
  )
  // 后续组件逻辑
}

方案2:类型守卫(更严谨)

如果不想使用非空断言,可通过类型守卫明确校验username类型,同时因enabled的存在,错误分支永远不会执行:

export function UserCard({ username }: Props) {
  const { data, isLoading } = useQuery(
    ['markets', username],
    () => {
      if (!username) {
        // 此分支不会执行,仅用于TS类型校验
        return Promise.resolve({} as Object)
      }
      return fetchUser(username)
    }, 
    {
      enabled: !!username,
      select: (data: Object): Object => {
        // 你的数据转换逻辑
        return data
      },
    }
  )
  // 后续组件逻辑
}

方案说明

  • enabled: !!username是核心:它确保只有当username为有效字符串时,queryFn才会被调用,从根源避免了undefined传入fetchUser的情况。
  • 两种方案都无需修改fetchUser的参数类型,符合需求。
  • 不会产生开发环境错误,因为未满足条件时查询不会触发,queryFn中的错误分支永远不会执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:57:39