首页 > 解决方案 > 为什么我不能在 RxJs 6 中减少到不同的类型?

问题描述

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

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

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

标签: javascriptrxjs

解决方案


所以这是一个工作版本

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 认为 theacc和 thevalue来自同一类型(number在您的情况下,因为您正在传递数字数组)

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

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

这里是reduce

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


推荐阅读