错误 TS2339:属性 'partition' 在类型 'Observable<boolean>' 上不存在

error TS2339: Property 'partition' does not exist on type 'Observable<boolean>'

之前我使用的是 rxjs-5,我使用的是 observable.partition 如下:

const [isTiming$, isNotTiming$] = this.store.select(state => state.tetris.isTiming)
        .partition(value => value);

升级后 angular8 rxjs 升级到 rxjs-6 后开始抛出以下错误:

 providers/timer.provider.ts(27,5): error TS2339: Property 'partition' does not exist on type 'Observable<boolean>'.

当我检查旧的 rxjs 实现时,它的实现如下:

  import { Observable } from '../Observable';
  import { partition as higherOrder } from '../operators/partition';
  /**
   * Splits the source Observable into two, one with values that satisfy a
   * predicate, and another with values that don't satisfy the predicate.
   */
   export function partition<T>(this: Observable<T>, predicate: (value: T, index: number) => boolean, thisArg?: any): [Observable<T>, Observable<T>] {
    return higherOrder(predicate, thisArg)(this);
  }

看到后github conversion

我认为我们应该弃用分区运算符并将其从 v7 中删除。

原因:

  • 不是真正的运算符:分区不是真正的 "operator" 因为它 returns [Observable, Observable] 而不是 Observable。这意味着它不像其他的那样通过管道组合。

  • 易于替换为过滤器:分区很容易替换为更广为人知的过滤器运算符。由于分区实际上与以下内容相同:const partition = (predicate) => [source.pipe(filter(predicate)), source.pipe(filter((x, i) => !predicate(x, i)))]

你的情况:

import {filter} = "rxjs/operators"
const source = this.store.select(state => state.tetris.isTiming);
const partition = (predicate) => [source.pipe(filter(predicate)), source.pipe(filter((x, i) => !predicate(x, i)))]

const [isTiming$, isNotTiming$] = partition(value => value);
  • 很少使用:根据我进行的任何代码调查,它很少使用(在我知道使用 RxJS 的数千行代码中)

我想你应该使用 Observable 方法 pipe,像这样:

const [isTiming$, isNotTiming$] = this.store.select(state => state.tetris.isTiming)
        .pipe(
            partition(value => value);
        )