TypeScript如何从重载泛型函数获取参数类型扩展第三方函数
问题根因
你遇到的报错是因为 TypeScript 的内置 Parameters 工具类型处理重载函数时,只会提取最后一个重载签名的参数类型。你给出的 baz 有两个重载,最后一个是参数为字符串类型的签名,所以 Parameters<typeof baz>[0] 推导出来的类型只有 string,自然传数字会报错。
解决方案
最简单的完整复用所有重载的方法是直接将扩展函数的类型标注为原函数的类型,写法如下:
const baz2: typeof baz = (p) => { // 你的自定义逻辑代码 baz(p) }
这种写法会完整继承 baz 的所有重载信息,调用 baz2(1)、baz2('2') 都能正常通过类型检查,参数类型、返回值类型和原函数完全一致,不需要你手动逐个对齐重载声明。如果后续第三方库更新了 baz 的重载,你也不需要修改 baz2 的类型定义,自动同步变更。
如果你的扩展函数需要增加额外入参,也可以手动对齐原函数的重载声明:
// 复用原函数的重载规则,新增可选的extra参数 export declare function baz2<T extends number>(param1: T, extra?: boolean): void export declare function baz2<T extends string>(param1: T, extra?: boolean): void // 函数实现 function baz2(p: number | string, extra = false) { // 自定义逻辑 baz(p) }
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

