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

时间:2018-03-04 19:01:27

标签: javascript typescript functional-programming

在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参数来破解它,但这会变得太脏并且会破坏功能方法。

1 个答案:

答案 0 :(得分:-1)

使用functon.length应该能够解决您的问题。