TypeScript中能否忽略无关的泛型类型参数?
如何省略未使用的泛型参数(第三方库类型)
我写了一个计算进度的函数,但里面的泛型参数T完全没用到,想把它删掉,结果直接删除后报错,提示Generic type 'JsonApiQueryData<T>' requires 1 type argument(s)。相关代码和类型定义如下:
我的函数:
function progress<T>(data: JsonApiQueryData<T>): number { const { links, meta } = data.getMeta(); if (!links.next) { return 1; } const url = new URL(links.next); return parseInt(url.searchParams.get('page[offset]')) / meta.total; }
第三方库的JsonApiQueryData定义:
export declare class JsonApiQueryData<T> { protected jsonApiModels: Array<T>; protected metaData: any; constructor(jsonApiModels: Array<T>, metaData?: any); getModels(): T[]; getMeta(): any; }
注意:我没办法修改这个第三方库的类型,所以需要在不改动它的前提下解决问题。
可行解决方案
1. 直接用unknown填充泛型参数
既然函数逻辑完全不依赖T的具体类型,给JsonApiQueryData传unknown就能满足类型要求,同时不用声明多余的泛型参数:
function progress(data: JsonApiQueryData<unknown>): number { const { links, meta } = data.getMeta(); if (!links.next) { return 1; } const url = new URL(links.next); return parseInt(url.searchParams.get('page[offset]')) / meta.total; }
2. 定义非泛型类型别名(简化写法)
如果觉得每次写JsonApiQueryData<unknown>太繁琐,可以提前定义一个类型别名:
type JsonApiQueryDataAny = JsonApiQueryData<unknown>; function progress(data: JsonApiQueryDataAny): number { // 函数逻辑和之前一样 }
3. 使用any(不推荐)
虽然any也能解决报错问题,但它会关闭类型检查,可能隐藏潜在问题,除非你确认完全不需要类型约束,否则不建议用:
function progress(data: JsonApiQueryData<any>): number { // 函数逻辑不变 }
内容的提问来源于stack exchange,提问作者msbit
相关产品推荐
相关产品推荐

