typescript - 传递接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数

标签 typescript

在 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/

相关文章:

arrays - 如何在 typescript 中定义常量数组

javascript - Typescript 本地存储兼容性

javascript - Babel/Typescript 别名无法正常工作

typescript - 无需按键即可在 VS Code 中查看 Typescript Prop 的所有 Intellisense 选项

typescript - 如何在 Typescript 中引用工厂创建类的实例?找不到名字错误

node.js - Mongoose 中的 UpdateMany 不工作但直接在 mongodb 中工作正常

javascript - 添加自定义 @polkadot/types 时 Polkadot-js Babel 错误

javascript - Typescript async/await 与 Observable 或 Promise

reactjs - VSCode : Cannot find module 'antd' or its corresponding type declarations

typescript - 如何在 CodeBuild/Ubuntu (TS2307) 中使用 tsc 解析相对路径?