【问题标题】:Why can't I reduce to a different type in RxJs 6?为什么我不能在 RxJs 6 中减少到不同的类型?
【发布时间】:2019-06-27 09:23:12
【问题描述】:

下面的示例不能作为版本 5 中链式运算符的直接转换工作。它会导致 Typescript 编译器错误。

from([1, 2]).pipe(
    reduce((acc, curr) => {
        return acc + ' ';
    }, '')
);

“MonoTypeOperatorFunction”类型的参数不可赋值 到“OperatorFunction”类型的参数。种类 参数 'source' 和 'source' 不兼容。 类型“Observable”不可分配给类型“Observable”。 类型“数字”不可分配给类型“字符串”。 [2345]

【问题讨论】:

  • 什么不起作用,我的意思是想要的输出是什么?
  • 它不能在 Typescript 中编译:“MonoTypeOperatorFunction”类型的参数不可分配给“OperatorFunction”类型的参数。参数 'source' 和 'source' 的类型不兼容。类型 'Observable' 不能分配给类型 'Observable'。类型“数字”不可分配给类型“字符串”。 [2345]
  • 这段代码的预期行为究竟是什么?看起来它只是为每个元素添加了一个空格' '...您不应该使用curr 值吗?
  • @JosepJoestar - 不。这只是一个指示性示例。

标签: javascript rxjs


【解决方案1】:

编辑:在 OP 描述他遇到 TypeScript 问题之前得到了回答

你需要导入 RxJs 并订阅流:

rxjs.from([1, 2]).pipe(
    rxjs.operators.reduce((acc, curr) => {
        return acc + ' ' + curr;
    }, '')
).subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

【讨论】:

  • 不,这不是原因 - 抱歉,我能理解这种混淆。我已经编辑了我的问题。
【解决方案2】:

看起来你有两种不同类型的 Observable 库,它们来自不同的 RxJS 副本(可能来自旧版本)。通过执行$ npm ls rxjs 来查看package.jsonpackage.lock.jsonnode_modules 文件夹中的重复包,或者干脆删除此包并执行另一个全新安装。让我知道它是否有效!

【讨论】:

    【解决方案3】:

    所以这是一个工作版本

    from([1, 2])
      .pipe(
        reduce<number, string>(
          (acc, curr) => {
            return acc + ' ';
          }, '')
      ).subscribe(x => {
        console.log(x);
      });
    

    现在稍微解释一下,这里的问题来自这一行(来自rxjs源)并定义了函数签名(类型)

    export function reduce<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;
    

    因此,在您的情况下,因为您没有明确地违反类型,rxjs 认为 accvalue 来自同一类型(在您的情况下为 number,因为您正在传递数字数组)

    通过明确地拒绝函数参数的类型,我们正在解决这个问题,因为我们有点帮助 rxjs/ts 使用下面的适当函数签名(这样就不会抛出错误)

    export function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed?: R): OperatorFunction<T, R>;
    

    Here is the reduce source

    如果我们必须总结一下,问题是 rxjs/ts 需要一些明确的分型帮助。

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2015-02-05
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多