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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typescript:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数相关的知识,希望对你有一定的参考价值。

在TypeScript中,我可以将具有较少参数的函数分配给具有更多变量的函数类型的变量(但不是相反的)(参见Comparing two functions)。这就是JS在实践中的使用方式,例如:

Array.map接受回调:(t: T, idx: number, arr: T[]) -> U

但我们经常传递一个需要较少params的函数:[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个或更少params的函数:

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:传递一个接受较少参数的函数 - 如何为传递的函数强制执行相同数量的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使 TypeScript 从数组中推断参数的数量和类型

是否可以在 TypeScript 中传播独特的泛型类型?

如何调用Func并将其传递给构造函数中具有较少参数的另一个Func?

#yyds干货盘点#学会TypeScript中函数重载写法

Typescript - 确保泛型属性存在于具有描述性错误的泛型类型上

TypeScript 函数