TypeScript中如何获取类成员方法的参数类型(含重载方法场景)
TypeScript中如何获取类成员方法的参数类型(含重载方法场景)
嘿,我完全懂你的困惑——拿普通函数的参数类型用Parameters<typeof func>简直手到擒来,但碰到类的实例方法就突然不好使了,尤其是重载方法的场景更棘手,我来给你拆解解决办法!
一、普通非重载方法的解决方案
你之前尝试typeof klasse.method失败,是因为直接访问实例方法时,TypeScript对它的类型处理和普通函数有差异。其实换个思路,用类的索引类型来引用方法的类型就搞定了,也就是Klasse["method"],再把它传给Parameters工具类型就能正确提取参数类型。
代码示例:
function func(a: number, b: string): string { return b; } type ftype = Parameters<typeof func>; // 正确得到 [number, string] class Klasse { method(a: number, b: string): string { return b; } } // 现在这样就能正常工作了 type mtype = Parameters<Klasse["method"]>; // 得到 [number, string]
二、重载方法的解决方案
你后来发现普通方案在重载方法上失效,这是因为Parameters工具类型默认只会提取方法的最后一个实现签名的参数类型,而不是所有重载的签名。要解决这个问题,我们可以自定义一个类型来遍历所有重载签名,把每个签名的参数类型合并成联合类型。
比如这样实现:
class Klasse { method(a: string, b: number): void; method(a: number, b: string): void; method(a: number | string, b: number | string): string { return 'x'; } } // 自定义类型,提取所有重载的参数类型 type OverloadParameters<T> = T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; } ? A1 | A2 | A3 : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; } ? A1 | A2 : Parameters<T>; // 现在就能拿到所有重载的参数类型联合了 type mtype = OverloadParameters<Klasse["method"]>; // 得到 [string, number] | [number, string] const a: mtype = [0, '']; // 正常通过类型检查 const b: mtype = ['', 9]; // 也正常,不会再报错
这个OverloadParameters类型可以根据你实际的重载数量扩展——如果有更多重载签名,只需要在条件分支里继续添加对应的(...args: infer An): infer Rn就行。
备注:内容来源于stack exchange,提问作者Galdor
相关产品推荐
相关产品推荐

