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
相关产品推荐
相关产品推荐

