【问题标题】:TypeScript/React how does scan operator work where currentvalue = function interface?TypeScript/React 在 currentvalue = 函数接口的情况下,扫描运算符如何工作?
【发布时间】:2018-10-28 07:18:14
【问题描述】:

我有一个带有以下参数的扫描运算符:

.scan(function (acc:Message[], x: (msg: Message[]) => Message[]){ return x(acc); }, initialMessages)

我的问题是 return x(acc) 实际上返回了什么?在这种特殊情况下,累加器function 是如何工作的? 我对 TypeScript 和 lambda 表达式很陌生,因此非常感谢任何帮助。

【问题讨论】:

    标签: reactjs function typescript rxjs accumulator


    【解决方案1】:

    在这种情况下,x(acc) 的类型将是 Message[]。你可以从第二个参数x 的签名中看出这一点,它返回Message[]

    通常scan() 接受带有累加器和值的函数(acc, val) => ...。并发出返回值。在这种情况下,进入扫描运算符的发射值val 是一个闭包。这有点不寻常,但非常好。输出示例

    [ 1, 2, 3 ]
    [ 3, 4, 5 ]
    [ 4, 5, 6 ]
    

    ...应该是:

    import { Observable } from 'rxjs/Rx';
    
    type Message = number;
    
    function scanFn(acc: Message[], x: (msg: Message[]) => Message[]): Message[] {
      return x(acc);
    }
    
    function mapFn(val: Message): (msg: Message[]) => Message[] {
      return x => x.map((y, i) => val + i);
    }
    
    Observable.from([1, 3, 4])
      .map(mapFn)
      .scan(scanFn, [1, 2, 3])
      .subscribe(console.log);
    

    【讨论】:

    • 感谢您的回答。有趣的例子。换句话说,对于输入 [1, 3, 4] 的每个元素,我们使用 map 运算符创建一个函数,然后将其用作 scanFn 的输入 arg (x):
    • 所以对于 [1, 3, 4] 输入数组的最后一个元素 (=4),扫描运算符将发出: return x(acc) = acc.map(function (y, i) { return val + i; }) =[1, 2, 3].map(function (y, i) { return val + i; }) = [1, 2, 3].map(function (y, i) { return 4 + i; }) // i = index values 0, 1, 2.. = [4+0, 4+1, 4+2] = [4, 5, 6]。 太好了!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 2017-01-09
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多