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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:22:50