当前位置: 首页 > 知识库问答 >
问题:

javascript - React-Query的useQuery的几个泛型怎么使用?

慕皓君
2023-04-23
export declare function useQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'queryFn'>): UseQueryResult<TData, TError>;

上面是定义,这四个泛型都表示什么意思呢,实践中要怎么用

  • TQueryFnData = unknown
  • TError = unknown
  • TData = TQueryFnData
  • TQueryKey extends QueryKey = QueryKey

共有2个答案

和丰羽
2023-04-23

理论上,这些泛型是可以通过类型推导的方式得出的,不需要你自己传入相关的类型。

最好的办法是将你的 fetcher callback 使用 QueryResult 进行类型标注

async function fetchTodos(): QueryResult<Todo[], Error> {
    const response = await fetch("...")
    if (!response.ok) {
        throw Error("...")    
    }
    return await response.json()
}
郭建华
2023-04-23

类型参数的含义:

  • TQueryFnData: 表示进行查询操作时返回的数据的类型。默认值为 unknown,即不知道类型,通常需要根据具体数据源的返回值定义相应的类型,以提高代码可读性并减少类型错误。
  • TError: 表示在查询过程中可能出现的错误类型。默认值同样为 unknown,但通常对于不同的数据源会有相应的错误类型约定,因此可以根据实际情况进行定义。例如,在 API 接口调用中可能会出现网络连接异常、身份认证失败等不同类型的错误,针对这些错误可以自定义不同的异常类来表示。通过给 TError 参数指定正确的泛型类型,可以使得在代码中使用时类型检查生效。
  • TData: 表示最终返回给组件渲染的数据类型。默认值为 TQueryFnData,即与查询函数的返回值类型相同。将泛型参数做绑定使得通过 useQuery 定义的 hook 在获取数据后直接能返回预期的数据格式。
  • TQueryKey extends QueryKey = QueryKey: 表示传递给查询函数的查询键(query key)的类型,它必须是一个数组类型或对象类型。默认值为 QueryKey,即 query key 可以是任何一种类型。在使用 useQuery 时需要根据实际查询的数据源来指定具体的查询键类型以及其格式。

当使用 useQuery 时,可以通过对泛型参数提供正确的类型绑定,让 React Query 在获取数据和处理异常时更加可靠和灵活。

interface Item {
  id: number;
  name: string;
}

// 定义一个接口类型用于声明 API 接口返回的数据结构
interface ListResponse {
  total: number;
  items: Item[];
}

function useItemList() {
  const queryKey = ['item-list'];
  const queryFn = (): Promise<ListResponse> => {
    return fetch('/api/item').then(res => res.json());
  };
  
  // 给 useQuery 函数传递泛型参数,指定其返回值类型、错误类型及数据类型等信息
  return useQuery<ListResponse, Error, Item[], typeof queryKey>(queryKey, queryFn);
}
 类似资料:
  • 调pickTwo报错: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; @SafeVarargs 怎么没效果呢?不是这样用的吗?

  • 使用table组件的时候报这个错误Warning: Each child in a list should have a unique "key" prop.Check the render method of Cell2.应该怎么解决,这个错误是与columns={columns}相关还是与dataSource={data}相关,我在table上面绑定了rowKey='id'还是不能解决。 还有

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 本文向大家介绍在React怎么使用Context?相关面试题,主要包含被问及在React怎么使用Context?时的应答技巧和注意事项,需要的朋友参考一下 context : Context提供了一种方式,能够让数据在组件树中传递,而不必一级一级手动传递。 API : createContext(defaultValue?)。 使用方法: 首先要引入createContext import Rea

  • Hooks for fetching, caching and updating asynchronous data in React Enjoy this library? Try the entire TanStack! React Table, React Form, React Charts Visit react-query.tanstack.com for docs, guides,