类型'Observable <string>'上不存在属性'first'

Sie*_*ebe 6 rxjs typescript angular

在Angular 5中,我想使用first()方法,如下所示:

this.ccService.mode.first().subscribe(mode => {
  this.mode = mode;
});
Run Code Online (Sandbox Code Playgroud)

我这样导入它:import { first } from 'rxjs/operators/first';.我也尝试从进口'rxjs/add/operator','rxjs/operators','rxjs',似乎没有任何工作.

但是,它拒绝工作,只给出了你在标题中看到的错误信息:[ts] Property 'first' does not exist on type 'Observable<string>'..

mode观察到:

private modeSource = new BehaviorSubject<string>('new');
public mode = this.modeSource.asObservable();

public setMode(mode: string) {
  this.modeSource.next(mode);
}
Run Code Online (Sandbox Code Playgroud)

我一直在谷歌搜索,但我似乎找不到任何有相同错误的人,我只是没有first()正确使用?我应该用.pipe(first()).subscribe吗?https://www.learnrxjs.io/operators/filtering/first.html使用observable.first().subscribeobservable.pipe(first()).subscribe间歇性不明确的解释和推理,所以我在这里有点失落.

ibe*_*oun 5

TL; DR; 是的,您应该使用可管道运营商.

rxjs v5.5以来的变化:

链接运算符的先前编码风格已经被一个运算符的结果与另一个运算符的管道替换.5.5版本中添加了可管道运算符.有关可管道运算符所需的推理和更改的完整讨论,请参阅RxJS文档.

这就是为什么:

针对点链的修补运算符的问题是:

任何导入补丁操作符的库都会为该库的所有使用者扩充Observable.prototype,从而创建盲目依赖.如果图书馆删除了他们的使用,他们会在不知不觉中打破其他人.使用pipeables,您必须将所需的运算符导入到您使用它们的每个文件中.

直接打印到原型上的操作员不会像汇总或webpack这样的工具"树木震动".可管理的操作员将只是直接从模块中提取的功能.

通过任何类型的构建工具或lint规则都无法可靠地检测到在应用程序中导入的未使用的运算符.这意味着您可以导入扫描,但是停止使用它,它仍然会被添加到您的输出包中.对于可管理的操作员,如果您不使用它,一个lint规则可以为您选择它.

功能性成分非常棒.构建自己的自定义运算符变得更加容易,现在它们的工作方式与rxjs中的所有其他运算符一样.您不再需要扩展Observable或覆盖提升.