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

如何从TypeScript重载函数类型中获取指定签名的参数类型?

获取Winston LeveledLogMethod指定重载签名的参数类型

针对你遇到的问题——直接用Parameters<LeveledLogMethod>只能拿到最后一个重载的参数类型,要提取(message: string, ...meta: any[]): Logger这个签名里meta的类型,可以通过TypeScript的条件类型、类型推断和Extract工具类型组合实现,步骤如下:

1. 问题根源

TypeScript中,当对重载函数/接口使用Parameters工具类型时,默认只会返回最后一个重载签名的参数类型,这就是你拿到[infoObject: object]的原因。要获取特定重载的类型,需要先精准定位到目标签名。

2. 实现方案

我们可以通过多层类型筛选,先锁定符合特征的重载签名,再提取目标参数类型:

// 假设已有这些依赖类型的定义
interface Logger {}
type LogCallback = () => void;

interface LeveledLogMethod {
  (message: string, callback: LogCallback): Logger;
  (message: string, meta: any, callback: LogCallback): Logger;
  (message: string, ...meta: any[]): Logger;
  (message: any): Logger;
  (infoObject: object): Logger;
}

// 第一步:筛选出参数长度为1的重载签名(剩余参数不计入函数length属性)
type Length1Signatures<T> = T extends (...args: any[]) => Logger 
  ? (T['length'] extends 1 ? T : never) 
  : never;

// 第二步:从长度为1的签名中,提取第一个参数为string的目标签名
type TargetSignature = Extract<Length1Signatures<LeveledLogMethod>, (message: string, ...args: any[]) => Logger>;

// 第三步:通过类型推断提取meta的类型
type MetaType = TargetSignature extends (message: string, ...meta: infer M) => Logger 
  ? M 
  : never;

// 测试:MetaType的类型为any[],符合预期
const meta: MetaType = [1, "test", { key: "value" }];

3. 简化写法

如果不需要分步验证,也可以将逻辑合并为一个类型,但要注意:若有多个重载匹配(message: string, ...meta: infer M) => Logger结构,会得到联合类型,因此分步筛选的方式更精准:

type MetaType = Extract<
  LeveledLogMethod, 
  (message: string, ...meta: infer M) => Logger
> extends (message: string, ...meta: infer M) => Logger 
  ? M 
  : never;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:43:28