TypeScript中对传入的动态函数使用Parameters报错如何解决
报错原因
Parameters工具类型的泛型要求传入的类型必须符合(...args: any) => any的函数签名约束,而你代码里给myFunction标注的TypeScript内置Function是非常宽泛的顶级类型,没有具体的签名结构,不满足该约束,因此抛出类型错误。
可行实现方案
通过泛型捕获传入函数的精确类型,替代宽泛的Function类型标注,即可正常使用Parameters提取参数类型,同时还能获得完整的类型校验能力:
public Execute<T extends (...args: any[]) => any>( module: ThisParameterType<T>, myFunction: T, params: Parameters<T> ) { // 可正常获取参数类型,无报错 type TestArgsType = Parameters<T>; // 注意:Function.prototype.apply的第二个参数要求是参数组成的数组/类数组,原代码将params标注为string本身不符合API要求,上述写法会自动做类型校验 myFunction.apply(module, params); }
实现说明
- 泛型参数
T会在你调用Execute方法时,根据传入的myFunction自动推断出精确的函数类型,满足Parameters的泛型约束,可正确提取出参数的元组类型。 - 用
ThisParameterType<T>标注module类型,可以自动匹配目标函数要求的this上下文类型,替代原代码里的any,提升类型安全性。 - 直接用
Parameters<T>标注入参params,TypeScript会自动校验你传入的参数列表是否和目标函数的参数要求匹配,避免传参错误。
使用示例
// 示例模块与目标函数 const userModule = { moduleName: 'user' }; function getUserInfo(this: typeof userModule, userId: number, showDetail: boolean) { return `${this.moduleName}: userId=${userId}, showDetail=${showDetail}`; } // 正常调用,类型校验通过 Execute(userModule, getUserInfo, [1001, true]); // 类型报错:参数类型不匹配,第一个参数要求number类型,传入了string Execute(userModule, getUserInfo, ['1001', true]);
如果你的业务场景中params确实是需要先传入序列化字符串再做解析,可以保留params: string的标注,在函数内部反序列化后通过类型断言匹配Parameters<T>即可,核心的泛型捕获函数类型的逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Resident Zero9999
相关产品推荐
相关产品推荐

