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

TypeScript中如何将泛型参数作为方法选项消除传参冗余

优化方案

当前冗余问题的核心是泛型参数与type入参没有做类型绑定,TypeScript无法根据传入的type值自动推导对应的响应类型,才需要手动重复指定类型。最合理的实现是建立responseType取值和返回类型的映射关系,让TS自动推导返回值类型,完全省略手动传入泛型的步骤。

  1. 首先定义类型映射表,对应XHR标准中不同responseType对应的返回值类型:
type ResponseTypeMap = {
  arraybuffer: ArrayBuffer;
  document: Document;
  blob: Blob;
  json: unknown; // 可根据需要改成any,json场景可额外做类型断言
  text: string;
}
  1. 改造原方法,用泛型约束入参type的取值范围,返回值直接从映射表中取对应类型:
private descargar<K extends keyof ResponseTypeMap>(
  url: string, 
  type: K
): Promise<ResponseTypeMap[K] | null> {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest();
    xhr.responseType = type;
    xhr.onload = () => {                              
      resolve(xhr.response);
    };
    xhr.onerror = () => resolve(null);
    xhr.open("GET", url);
    xhr.send();
  })
}
  1. 改造后调用时不需要再手动传入泛型参数,TS会根据你传入的type值自动推导返回类型:
// 自动推导response类型为 Blob | null
const response = await this.descargar(url, "blob");

// 其他场景自动对应类型
const textContent = await this.descargar(url, "text"); // string | null
const jsonData = await this.descargar(url, "json"); // unknown | null
const fileBuffer = await this.descargar(url, "arraybuffer"); // ArrayBuffer | null

可选优化点

  • 如果需要json场景支持指定具体返回结构,可以给方法加一个函数重载,不影响其他类型的自动推导逻辑
  • 现有逻辑仅在网络请求失败时返回null,可在onload回调中增加HTTP状态码校验(状态码200-299为成功),兼容HTTP层面的错误场景
  • 原代码中var声明可替换为const,避免变量提升问题

内容的提问来源于stack exchange,提问作者Orión González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:24:25