如何在TypeScript中向另一个函数传递带参数的函数并执行?
解决方法
你当前写法的核心问题是:getTheResult1(2,3,4)会立即执行,把返回的数字传给intermediary,而非传递一个待执行的函数。此时passedFunction是数字类型,调用passedFunction()必然报错。
正确的思路是把带参数的目标函数调用,包裹成一个无参回调函数传给中间件,让中间件在校验通过后再执行这个回调。
基础实现(适配返回数字的函数)
function getTheResult1(inputVal: number, multiplier: number, subtractor: number): number { return inputVal * multiplier - subtractor; } function getTheResult2(inputVal: number, dividor: number): number { return inputVal / dividor; } // 修改中间件,接收无参回调函数 function intermediary(callback: () => number, name: string): number { if (name === 'John') { return -1; } // 校验通过后执行回调 return callback(); } // 调用时用箭头函数包裹目标函数的带参调用 let myFirstNum = intermediary(() => getTheResult1(2, 3, 4), 'John'); let mySecondNum = intermediary(() => getTheResult2(2, 3), 'Doe'); console.log(myFirstNum); // 输出 -1 console.log(mySecondNum); // 输出 0.666...
泛型进阶版(支持任意返回类型)
如果需要适配返回字符串、对象等其他类型的函数,可以用泛型让中间件更通用:
// 泛型中间件,T代表回调的返回类型 function intermediary<T>(callback: () => T, name: string): T | number { if (name === 'John') { return -1; // 若需严格类型匹配,可替换为对应T类型的默认值 } return callback(); } // 示例:返回字符串的函数 function getGreeting(name: string): string { return `Hello, ${name}!`; } let greeting = intermediary(() => getGreeting('Alice'), 'Doe'); console.log(greeting); // 输出 "Hello, Alice!" let blockedGreeting = intermediary(() => getGreeting('Bob'), 'John'); console.log(blockedGreeting); // 输出 -1
这种方式的优势是完全适配任意参数结构的目标函数——中间件无需关心目标函数的参数细节,只负责校验后执行回调即可。
内容的提问来源于stack exchange,提问作者JosephG
相关产品推荐
相关产品推荐

