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

调用useGetAuthorizationWrapper时如何修改返回data的类型为数组?

解决useGetAuthorizationWrapper()返回unknown数组的类型问题

问题根源

你之前尝试的useGetAuthorizationWrapper<{ data: [] }>()写法错误,因为它把泛型参数指定为了包含data属性的对象类型,而非数组本身。要解决类型报错,需要针对自定义Hook的泛型定义或调用方式做调整,分两种情况处理:


情况1:可以修改useGetAuthorizationWrapper内部代码

既然这个Hook内部调用了react-query的useQuery,你可以给它添加泛型参数来指定返回data的类型,让Hook支持类型推导:

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

// 定义泛型Hook,T代表data的实际类型,默认值为unknown
function useGetAuthorizationWrapper<T = unknown>(
  queryKey: QueryKey,
  // queryFn返回Promise<T>,对应接口返回的数组类型
  queryFn: () => Promise<T>
) {
  // 给useQuery传入泛型T,明确接口返回数据类型
  const { data } = useQuery<T>(queryKey, queryFn);
  return { data };
}

调用时直接指定数组类型(比如string[]或自定义对象数组YourAuthItem[]):

// 示例1:任意类型数组
const { data } = useGetAuthorizationWrapper<unknown[]>(['auth'], fetchAuthData);

// 示例2:特定类型数组(推荐,类型更安全)
interface AuthItem {
  id: string;
  permission: string;
}
const { data } = useGetAuthorizationWrapper<AuthItem[]>(['auth'], fetchAuthData);

使用时注意react-query的data可能为undefined(加载/错误状态),先做存在性判断再访问length:

if (data) {
  console.log(data.length); // 此时data已被推断为数组类型,无报错
}

情况2:无法修改useGetAuthorizationWrapper内部代码

如果Hook是第三方提供的,无法修改源码,可通过类型断言或类型守卫来处理:

方法1:类型断言(快速但需确保数据确实是数组)

const { data } = useGetAuthorizationWrapper() as { data: unknown[] };

// 或更具体的类型
const { data } = useGetAuthorizationWrapper() as { data: AuthItem[] };

方法2:类型守卫(更安全,运行时校验)

// 定义类型守卫函数
function isAuthArray(data: unknown): data is AuthItem[] {
  return Array.isArray(data) && data.every(item => 
    typeof item === 'object' && item !== null && 'id' in item && 'permission' in item
  );
}

const { data } = useGetAuthorizationWrapper();
if (isAuthArray(data)) {
  console.log(data.length); // 类型推导为AuthItem[],安全访问
}

内容的提问来源于stack exchange,提问作者bhargava.prabu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:55:23