如何获取重载函数的类型定义?
如何获取重载函数的类型定义?
刚好我之前也处理过类似的场景,针对你要获取OAuth2Client.prototype.getToken中getToken(code: string)这个特定重载的返回类型需求,有两种常用的方法,我给你详细拆解下:
方法一:用Extract精准匹配目标重载(推荐)
这种方法不需要依赖重载的定义顺序,通过匹配函数的参数签名来精准定位目标重载,可靠性更高。具体代码如下:
// 提取符合参数为string的getToken重载,再获取它的返回类型 type GetTokenResponse = ReturnType<Extract<typeof OAuth2Client.prototype.getToken, (code: string) => any>>;
原理是:
typeof OAuth2Client.prototype.getToken会获取到getToken的全部重载类型集合Extract<..., (code: string) => any>会从集合中筛选出参数为string的那个重载函数类型- 最后用
ReturnType提取该函数的返回类型
方法二:通过重载索引直接获取(注意顺序陷阱)
TypeScript中,重载函数的类型会以数组形式存储,但数组的索引顺序和你定义重载的顺序是相反的——第一个定义的重载对应数组的最后一个索引,最后定义的重载对应数组的第一个索引。
假设getToken的重载定义是这样的:
class OAuth2Client { // 第一个重载 getToken(code: string): Promise<{ access_token: string }>; // 第二个重载 getToken(options: { refresh_token: string }): Promise<{ access_token: string; refresh_token: string }>; // 实现体 getToken(arg: string | { refresh_token: string }) { return Promise.resolve({ access_token: 'dummy' }); } }
那么你要的getToken(code: string)是第一个定义的重载,对应的索引是1,代码如下:
type GetTokenResponse = ReturnType<(typeof OAuth2Client.prototype.getToken)[1]>;
这种方法的缺点是如果后续重载的顺序被修改,你的类型定义就会出错,所以只适合重载结构固定不会变动的场景。
备注:内容来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

