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

