如何在TypeScript中提取重载函数getToken的Promise返回类型?
如何从重载的getToken函数中提取Promise类型?
场景
我有如下TypeScript文件,尝试为getToken函数添加GetTokenResponse类型注解:
import { ConfigService } from '@nestjs/config'; import { google, GoogleApis } from 'googleapis'; import { AppConfig } from 'src/configurations/app.config'; type OAuth2Client = InstanceType<GoogleApis['auth']['OAuth2']>; type GetTokenResponse = ReturnType<OAuth2Client['getToken']>; getToken(code: string): GetTokenResponse { return this.oAuth2Client.getToken(code); }
问题
以下代码会返回void类型:
type GetTokenResponse = ReturnType<OAuth2Client['getToken']>; // 类型为void
原因是getToken函数存在4个重载:
getToken(code: string): Promise<GetTokenResponse>; getToken(options: GetTokenOptions): Promise<GetTokenResponse>; getToken(code: string, callback: GetTokenCallback): void; getToken(options: GetTokenOptions, callback: GetTokenCallback): void;
解决方案
TypeScript处理重载函数时,ReturnType默认只会取最后一个重载的返回类型,也就是带回调参数的void,这就是当前得到void的原因。要提取返回Promise的重载类型,可以用以下几种方式:
方式一:指定重载索引提取
直接通过类型断言锁定目标重载签名,再获取其返回类型:
// 获取第一个重载(仅传code参数)的返回类型 type GetTokenResponse = ReturnType<(OAuth2Client['getToken'] as { (code: string): Promise<unknown>; })>;
方式二:用条件类型提取Promise内部类型
定义工具类型筛选出返回Promise的签名,再提取包裹的实际响应类型:
// 工具类型:提取Promise包裹的内部类型 type UnwrapPromise<T> = T extends Promise<infer R> ? R : never; // 匹配仅传code的重载签名,提取其返回的Promise内部类型 type GetTokenResponse = UnwrapPromise<ReturnType<Extract<OAuth2Client['getToken'], (code: string) => Promise<any>>>>;
方式三:精准匹配函数签名
先定义你实际调用的函数签名,再从重载集合中提取对应类型:
// 定义你使用的getToken调用签名(仅传code) type TargetGetTokenSignature = (code: string) => Promise<unknown>; // 从重载集合中提取该签名并获取返回类型 type GetTokenResponse = ReturnType<Extract<OAuth2Client['getToken'], TargetGetTokenSignature>>;
这些方法都能帮你正确获取到getToken返回的Promise<GetTokenResponse>类型,可根据代码风格选择合适的方式。
内容的提问来源于stack exchange,提问作者Abhishek Pankar
相关产品推荐
相关产品推荐

