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

TypeScript能否按名称指定泛型参数?求简洁标注方法

TypeScript中如何简洁指定泛型的非连续参数?

假设我们有一个带默认类型的泛型方法,比如Axios的post方法定义:

post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig): Promise<R>;

我们可以轻松指定第一个泛型参数(响应数据类型T):

myClient.post<MyResponseType>(...)

但如果想同时指定第三个泛型参数(请求体类型D),中间的R是基于T派生的默认类型,不需要手动指定,但TypeScript目前不支持类似post<MyResponseType, D=MyRequestType>的命名泛型参数简写,只能冗余写出完整三个参数:

myClient.post<MyResponseType, AxiosResponse<MyResponseType>, MyRequestType>(...)

有没有更简洁的方式同时标注请求和响应类型?


可行的简洁方案

1. 封装自定义的post方法

在你的Axios实例外层封装一个简化版的post方法,只暴露需要的泛型参数T(响应类型)和D(请求体类型),中间的R直接用默认派生类型:

// 基于现有Axios实例封装
const apiClient = {
  post<T = any, D = any>(url: string, data?: D, config?: AxiosRequestConfig) {
    return myClient.post<T, AxiosResponse<T>, D>(url, data, config);
  }
};

使用时直接指定两个泛型参数即可,顺序对应响应类型和请求体类型:

apiClient.post<MyResponseType, MyRequestType>(...)

2. 用类型别名简化中间参数

如果不想封装方法,可以定义一个类型别名复用AxiosResponse<T>的推导:

type ApiResponse<T> = AxiosResponse<T>;

之后使用时可以用别名代替重复的类型定义:

myClient.post<MyResponseType, ApiResponse<MyResponseType>, MyRequestType>(...)

这种方式虽然还是要写三个参数,但比直接重复写完整的AxiosResponse<MyResponseType>更简洁,也更易维护。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:32