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

如何解决TypeScript泛型约束T extends DataResponse<T>不满足报错

问题根因

你定义的DataResponse<Data>接口的泛型参数Data是用来指定data数组的元素类型,而你给Hook写的泛型约束T extends DataResponse<T>属于错误的循环引用:相当于要求传入的类型T的data属性必须是T类型的数组,和你实际的接口响应结构完全冲突。
你实际的ClassesResponse的data字段是业务对象数组,不是ClassesResponse自身的数组,自然触发类型不兼容报错。

修复方案

调整Hook的泛型约束即可,不需要修改原有调用逻辑:

// 定义通用的接口响应基类,兼容你带total的结构
interface BaseResponse<DataItem> {
  data: DataItem[];
  total: number;
}

// 泛型T代表完整的接口响应类型,约束它满足BaseResponse的结构即可
export const useRequestInfiniteHooks = <T extends BaseResponse<any>>() => {
  const url = "/lms/class/all";

  const result = apiRequest()
  const mappedData: T['data'] = mappingData()

  return {data: mappedData};
};

// 原有调用代码完全无需修改,类型会自动匹配
type ClassesResponse = {
  data: {
    id: string;
    title: string;
  }[];
  total: number;
};

const MantapComponent = () => {
  // 这里返回的data类型会自动匹配为 {id: string; title: string;}[]
  const { data } = useRequestInfiniteHooks<ClassesResponse>();
};
可选优化

如果希望泛型语义更清晰,也可以直接将Hook的泛型指定为data数组的元素类型,写法如下:

export const useRequestInfiniteHooks = <T, >() => {
  const url = "/lms/class/all";
  const result = apiRequest()
  const mappedData: T[] = mappingData()
  return {data: mappedData};
};

const MantapComponent = () => {
  // 直接传入业务对象类型,返回的data自动为该类型的数组
  const { data } = useRequestInfiniteHooks<{id:string; title:string}>();
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 19:39:04