微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何在打字稿中键入lodash流函数?

lodash.flow结合了两个或多个功能.

lodash.flow(double,addTwo)将返回一个函数,它将加倍并添加两个.应该如何在打字稿中键入此函数(当前定义只返回Function)?

声明函数流< In,Intermediate,Out>(f1:(a1:In)=>中间,f2:(a1:中间)=> Out):( a1:In)=> Out适用于两个函数,第一个函数具有一个输入参数.我不确定如何在所有情况下扩展定义.

如果像这样调用,我的尝试可以支持多个函数

lodash.flow(f1,lodash.flow(f2,f3))

但我在找

lodash.flow(f1,f2,f3)

解决方法:

我不相信你能写出这个定义.

如果我们看一下the lodash type declaration file,他们就不会试图表达这种关系.

interface LoDashStatic {
    flow<TResult extends Function>(...funcs: Function[]): TResult;
}

但仅凭这一点并不足以打折这种可能性.作者可能只是忽略了一些东西,所以让我们继续思考它.

单个函数链之间的关系是您可以表示的.你已经在上面的例子中这样做了.您可以为多个参数长度创建相同构思的手动版本,但这是因为您正在设置链的长度已知并且您可以授予单个类型信息的情况.

如果我们要处理可变长度参数的情况,我们必须将参数视为Collection.因为所有变量必须具有单个(尽管可能是参数化的)类型,所以此集合对象也必须如此.但是,各种功能的类型不对齐. (参数:A)=> B与(param:B)=>的类型不同C并且不能存储在同一个良好类型的容器中(除了联合类型,但那些也不会缩放).

在您希望在这样的参数列表中保留类型信息的情况下,通常在两个参数上定义组合函数并将其应用于多个函数.例如,这就是在承诺中保留类型信息的方式.为此,您仍然需要拼出每个单独的参数.它只是使它到最后你有正确的输出类型.也就是说,在大多数情况下,这就是你想要的,所以这一切都很好.

如果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] 举报,一经查实,本站将立刻删除。

相关推荐