在 TypeScript 中,我可以将参数较少的函数分配给变量较多的函数类型的变量(但反过来不行,请参阅 Comparing two functions)。这就是JS在实践中的使用方式,例如
Array.map 接受回调:(t: T, idx: number, arr: T[]) -> U
但我们经常传递一个需要较少参数的函数:[1,2,3,4,5].map(e => e * 2)
如果我想强制只接受参数数量严格相同的函数怎么办(否则会出现 TSC 错误)?因为这与 TypeScript 相关,所以它应该是编译时错误,而不是运行时错误。
例子:
接受如下函数的简单计算器:
type ArithmeticFn = (a: number, b: number) => number;
我创建了一些满足要求的函数
const add: ArithmeticFn = (a, b) => a + b;
const sub: ArithmeticFn = (a, b) => a - b;
const mul: ArithmeticFn = (a, b) => a * b;
还有一个没有:
const sth: ArithmeticFn = (a) => a ** 2;
以下对象将接受具有 2 个或更少参数的函数:
const Calculator = {
perform(oper: ArithmeticFn, op1, op2) {
return oper(op1, op2);
}
}
因此,下面的函数打破了我的逻辑:
Calculator.perform((a) => a**2, 1, 2)
换句话说,是否有任何其他方法可以强制执行(因此上面的示例会引发错误)?我可以通过用选项包 ({a: number, b: number}
) 替换位置 fn 参数来破解它,但这太脏了,破坏了功能方法。
最佳答案
使用function.length应该可以解决你的问题。
关于typescript - 传递接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49099224/