lodash.flow
结合了两个或多个功能。
lodash.flow(double, addTwo)
将返回一个函数,该函数将加倍并加两个。如何在打字稿中键入此函数(当前定义仅返回Function)?
declare function flow<In, Intermediate, Out>(f1: (a1: In) => Intermediate, f2: (a1: Intermediate) => Out): (a1: In)=> Out
适用于两个函数,第一个具有一个输入参数。我不确定如何在所有情况下都可以使用该定义。
如果这样调用,我的尝试可以支持多种功能:
lodash.flow(f1, lodash.flow(f2, f3))
但我正在寻找
lodash.flow(f1, f2, f3)
我不相信您可以编写该定义。
如果我们查看lodash类型声明文件,则它们不会尝试表达这种关系。
interface LoDashStatic {
flow<TResult extends Function>(...funcs: Function[]): TResult;
}
但是,仅凭这一点还不足以打消这种可能性。作者可能只是忽略了一些东西,所以让我们继续考虑一下。
您可以表示单个功能链之间的关系。在上面的示例中,您已经这样做了。您可以为多个长度的参数创建相同想法的手动版本,但这是因为您正在设置一种情况,其中链的长度是已知的,并且您可以授予单个类型信息。
如果要处理可变长度参数的情况,则必须将这些参数视为Collection。因为所有变量都必须具有单个(尽管可能是参数化的)类型,所以此集合对象也必须具有单个类型。但是,各种功能的类型不一致。(param:A) => B
与的类型不同,(param:B) => C
并且不能存储在相同的类型良好的容器中(限制并集类型,但也不会缩放)。
在要在这样的参数列表上保留类型信息的情况下,通常可以在两个参数上定义组合函数,并将其应用于多个函数。例如,这就是类型信息在promise中保留的方式。为此,您仍然需要阐明每个单独的参数。这样一来,到最后您就拥有了正确的输出类型。就是说,在大多数情况下,这就是您想要的,这一切都很好。
如果lodash用一种类型正确的函数式语言编写,则该流函数可能将不存在。我想它会被改写为管道组成的对象。
更新:当我说“管道合成对象”时,我是什么意思?可能是这样的:
class FunctionComposer<T,V> {
constructor(protected func: (param: T) => V) { }
public compose<X>(newFunc: (param:V) => X) {
return new FunctionComposer((x: T) => newFunc(this.func(x)));
}
public out() {
return this.func;
}
}
let composedFunc = new FunctionComposer((x: number) => x * 2)
.compose(x => x.toString())
.out();
// composedFunc has type (param:number) => string
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句