Typescript 在compose上扩展FN数组会导致;应为1-6个参数,但得到0个或更多“;

Typescript 在compose上扩展FN数组会导致;应为1-6个参数,但得到0个或更多“;,typescript,ramda.js,Typescript,Ramda.js,我知道typescript看到一个扩展,并假设它可以是任意长度的,这就是为什么它抱怨有太多的参数(compose function arity是1-6) 当获取长度未知的函数数组时,如何满足编译器的要求 从“ramda”导入{compose}; //就编译而言,fns可能是任意长度(甚至超过6) 常数fns=[ n=>n*10, n=>n+1, ] const composed=compose(…fns)//Typescript:“应为1-6个参数,但得到0个或更多” 我从以下方面找到了解决方法

我知道typescript看到一个扩展,并假设它可以是任意长度的,这就是为什么它抱怨有太多的参数(compose function arity是1-6)

当获取长度未知的函数数组时,如何满足编译器的要求

从“ramda”导入{compose};
//就编译而言,fns可能是任意长度(甚至超过6)
常数fns=[
n=>n*10,
n=>n+1,
]
const composed=compose(…fns)//Typescript:“应为1-6个参数,但得到0个或更多”
我从以下方面找到了解决方法:

const composeList=list=>R.reduceRight(R.compose,R.identity,list)
const composed=composeList(fns)//不再扰乱编译器
组成(2)/=>30
根据我对上面代码片段的理解,我们将把
列表中的每个项目逐一传递给
compose
函数。在这种情况下,<代码> R.identity <代码>中间将返回最后一个函数(<代码> fn(0)在数组中或<代码>撰写(FN) >其中<代码> fn>代码>是最后一个fn.< /p>的组合版本。
它相当于
R.compose(R.compose(fns[0]),fns[1])
它为数组中的每个项嵌套一个组合。由于我使用1-2个参数调用每个
组合
,它不再扰乱编译器。

如果您想让编译器知道一个数组文本有多少个元素,您可能需要使用a来要求编译器将其推断为:

(还要注意,我将回调参数注释为
number
,否则您将得到一个隐式
any
,这可能是您不想要的)

然后,
compose()
将按预期工作:

const composed = compose(...fns); // no error

现在,您只需要受堆栈大小的限制。列表的长度不能超过JS解释器允许的堆栈帧数。
const composed = compose(...fns); // no error