译零 TransZero · TanStack Query 中文文档
主站

TypeScript

更新于 2026-11-02 Solid 查看英文原文 ↗

Solid Query 使用 TypeScript 编写,以确保该库及你的项目具备类型安全性!

需注意以下几点:

  • TanStack Query 遵循 DefinitelyTyped 的支持窗口,支持过去两年内发布的 TypeScript 版本。目前这意味着 TypeScript 5.7 及更高版本。
  • 本仓库中类型的变更被视为 非破坏性变更,通常以 补丁(patch) 语义化版本形式发布(否则每次类型增强都将触发主版本升级!)。
  • 强烈建议你将 solid-query 包版本锁定到特定补丁版本,并在升级时预期类型可能在任意版本间被修复或升级。
  • Solid Query 中与类型无关的公共 API 仍严格遵循语义化版本规范。

类型推断

Solid Query 中的类型通常能顺畅流动,因此你通常无需手动提供类型注解。

TypeScript
1import { useQuery } from '@tanstack/solid-query'2 3const query = useQuery(() => ({4  queryKey: ['number'],5  queryFn: () => Promise.resolve(5),6}))7 8query.data9//    ^? (property) data: number | undefined

typescript playground

TypeScript
1import { useQuery } from '@tanstack/solid-query'2 3const query = useQuery(() => ({4  queryKey: ['test'],5  queryFn: () => Promise.resolve(5),6  select: (data) => data.toString(),7}))8 9query.data10//    ^? (property) data: string | undefined

typescript playground

若你的 queryFn 具有明确定义的返回类型,则此机制效果最佳。请注意,大多数数据拉取库默认返回 any,因此请确保将其提取为一个具有正确类型的函数:

TypeScript
1const fetchGroups = (): Promise<Group[]> =>2  axios.get('/groups').then((response) => response.data)3 4const query = useQuery(() => ({5  queryKey: ['groups'],6  queryFn: fetchGroups,7}))8 9query.data10//    ^? (property) data: Group[] | undefined

typescript playground

类型缩小

Solid Query 对查询结果使用了 可区分联合类型(discriminated union type),该类型通过 status 字段及派生的状态布尔标志进行区分。这使你可以检查例如 success 状态,从而确保 data 已定义:

TypeScript
1const query = useQuery(() => ({2  queryKey: ['number'],3  queryFn: () => Promise.resolve(5),4}))5 6if (query.isSuccess) {7  const data = query.data8  //     ^? const data: number9}

typescript playground

为 error 字段指定类型

error 字段的默认类型为 Error,因为这是大多数用户的预期行为。

TypeScript
1const query = useQuery(() => ({2  queryKey: ['groups'],3  queryFn: fetchGroups,4}))5 6query.error7//    ^? (property) error: Error | null

typescript playground

若你想抛出一个自定义错误,或完全不是 Error 的值,可显式指定 error 字段的类型:

TypeScript
1const query = useQuery<Group[], string>(() => ({2  queryKey: ['groups'],3  queryFn: fetchGroups,4}))5 6query.error7//    ^? (property) error: string | null

但此举的缺点是,useQuery 的其他所有泛型的类型推断将不再生效。通常不推荐抛出非 Error 类型的值;因此,若你有一个类似 AxiosError 的子类,可使用 类型缩小 使 error 字段类型更具体:

TypeScript
1import axios from 'axios'2 3const query = useQuery(() => ({4  queryKey: ['groups'],5  queryFn: fetchGroups,6}))7 8query.error9//    ^? (property) error: Error | null10 11if (axios.isAxiosError(query.error)) {12  query.error13  //    ^? (property) error: AxiosError14}

typescript playground

TypeScript
1import '@tanstack/solid-query'2 3declare module '@tanstack/solid-query' {4  interface Register {5    // Use unknown so call sites must narrow explicitly.6    defaultError: unknown7  }8}9 10const query = useQuery(() => ({11  queryKey: ['groups'],12  queryFn: fetchGroups,13}))14 15query.error16//    ^? (property) error: unknown | null

注册全局 Meta

与注册 全局错误类型 类似,你也可以注册一个全局 Meta 类型。这可确保 查询 和 修改 上的可选 meta 字段保持一致且类型安全。注意:所注册的类型必须继承 Record<string, unknown>,以保证 meta 仍为对象。

TypeScript
1import '@tanstack/solid-query'2 3interface MyMeta extends Record<string, unknown> {4  // Your meta type definition.5}6 7declare module '@tanstack/solid-query' {8  interface Register {9    queryMeta: MyMeta10    mutationMeta: MyMeta11  }12}

为查询选项指定类型

若你直接将查询选项内联传入 useQuery,将自动获得类型推断。但你可能希望将查询选项提取为独立函数,以便在 useQuery 和例如 query 之间复用。此时,类型推断将丢失。为恢复推断能力,可使用 queryOptions 辅助函数:

TypeScript
1import { queryOptions } from '@tanstack/solid-query'2 3function groupOptions() {4  return queryOptions({5    queryKey: ['groups'],6    queryFn: fetchGroups,7    staleTime: 5 * 1000,8  })9}10 11useQuery(groupOptions)12queryClient.query(groupOptions())

此外,queryOptions 返回的 queryKey 会知晓其关联的 queryFn 类型,我们可利用该类型信息,使 queryClient.getQueryData 等函数也感知这些类型:

TypeScript
1function groupOptions() {2  return queryOptions({3    queryKey: ['groups'],4    queryFn: fetchGroups,5    staleTime: 5 * 1000,6  })7}8 9const data = queryClient.getQueryData(groupOptions().queryKey)10//    ^? const data: Group[] | undefined

若不使用 queryOptions,则 data 的类型将为 unknown,除非你为其显式传入泛型参数:

TypeScript
1const data = queryClient.getQueryData<Group[]>(['groups'])

使用 skipToken 实现类型安全的查询禁用

若你正在使用 TypeScript,可借助 skipToken 禁用查询。当你需要基于某个条件禁用查询,同时又希望保持查询的类型安全性时,此功能非常有用。

更多详情请参阅 禁用查询 指南。

本页为 TanStack Query 文档(Solid 版)的非官方中文翻译,原文由上游团队维护,遵循 MIT 许可。 译文如有偏差,以英文原文为准。

译自上游 59d11de