如何为TypeScript接口内的所有函数统一新增一个参数?
问题根源
- 类型推导断层:你定义的
FunctionMap和RecordWithCallback是两个独立的映射类型,TypeScript无法自动推导同一Key下,Parameters<FunctionMap<T>[Key]>拼接回调后和Parameters<RecordWithCallback<T>[Key]>的等价关系,因此触发2345错误。 - 入参类型不匹配:你给proxy函数的
api参数定义的类型是ExternalAPI<RecordWithCallback<T>>,但实际使用时传入的是原生的ExternalAPI<FunctionTypes>,二者泛型参数完全不同,本身就存在类型兼容性问题。
修复方案
// 第三方原生定义保持不变 interface ExternalAPI<T extends Record<string, any>>{ apiFunction<Key extends keyof T>(key: Key, ...others:Parameters<T[Key]>):void; } type Func = (...args: any[]) => any // 简化泛型约束,直接关联T和Key的关系 function proxyCallToAPI< T extends Record<string, Func>, Key extends keyof T >( api: ExternalAPI<T>, key: Key, // 限制用户传入的参数为原函数定义的参数,不允许额外传回调 ...baseParameters: Parameters<T[Key]> ){ // 因为运行时确实支持末尾加回调,这里做类型断言绕过原生定义的限制 const args = [...baseParameters, () => { console.log('Success!') }] as Parameters<T[Key]> api.apiFunction(key, ...args) } // 用法示例 interface FunctionTypes { f(n:number, s:string):void } const apiInstance = new ExternalAPI<FunctionTypes>(); proxyCallToAPI(apiInstance, 'f', 3, "3") // 类型正常,运行正常 proxyCallToAPI(apiInstance, 'f', 3, "3", console.log) // 类型报错,多传了参数
方案说明
- 简化泛型约束后,TS可以直接识别
T[Key]的参数结构,不用再绕两层映射类型,避免了推导断层。 - 由于第三方原生类型没有声明回调参数,我们在拼接参数后做一次类型断言,这个断言是安全的,因为你已经确认运行时支持该用法。
- 入参
baseParameters直接绑定原函数的参数类型,天然限制了用户不能额外传入回调,符合预期要求。
内容的提问来源于stack exchange,提问作者Marcel M
相关产品推荐
相关产品推荐

