如何在使用lettable publishLast运算符时获取ConnectableObservable

时间:2017-11-07 10:05:07

标签: angular rxjs

我怎样才能重构这一点:

  const warmObservable = this.httpClient.get<Result[]>(url).publishLast();
  warmObservable.connect();

给可招聘的运营商?

当我使用时:

  const warmObservable = this.httpClient.get<Result[]>(url).pipe(publishLast());
  warmObservable.connect();

我收到错误:

Property 'connect' does not exist on type 'Observable<any>'.

使用的版本:rxjs@5.5.2

2 个答案:

答案 0 :(得分:2)

pipe方法始终会返回Observable,如您所见:https://github.com/ReactiveX/rxjs/blob/master/src/Observable.ts#L293

所以你需要自己进行类型转换。

const warmObservable = this.httpClient.get<Result[]>(url).pipe(publishLast()) as ConnectableObservable;
warmObservable.connect();

答案 1 :(得分:1)

从rxjs 5.5源代码(rxjs / util / pipe.ts),pipe与一个运算符的签名是

export function pipe<T, A>(op1: UnaryFunction<T, A>): UnaryFunction<T, A>;

所以我希望.pipe(publishLast())拥有connect方法。

如果我在Angular(CodePen)之外进行测试,它确实可以正常工作

// https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js
const Observable = Rx.Observable
const publishLast = Rx.operators.publishLast

const src = Observable.interval(1000).take(5)
console.log(src)

const warmObservable1 = src.publishLast()
console.log(warmObservable1)  // verify this has connect()

const warmObservable2 = src.pipe(publishLast()) 
console.log(warmObservable2)  // verify this has connect()
warmObservable2.subscribe(console.log)  // outputs '4'
warmObservable2.connect()

问题是:

  • 是版本的东西(适用于5.5.2)
  • 是一个角色的东西
  • 是一个重要的东西

来自参考:Lettable operators doc

  

现在在Observable.prototype.pipe中有一个内置于Observable的管道方法,它可以用来组合运算符,类似于你用于点链的方式(如下所示)。

     

rxjs / util / pipe上还有一个管道实用程序函数,可用于从其他可运行的运算符构建可重用的lettable运算符。

util版本适用于我,也许rxjs/util/pipe需要单独导入?

这样的东西
import { pipe } from 'rxjs/util/pipe'

最佳结论

问题似乎与当前分发的打字文件Observable.d.ts有关,它将返回值键入为Observable

运行时Observable.js使用rxjs/util/pipe,其返回类型为封闭运算符,因此返回值将包含运算符的方法。

我不确定这是否可归类为错误,但无论如何,通过强制转换来绕过Observable.d.ts,例如

const warmObservable = <any>this.httpClient.get<Result[]>(url).pipe(publishLast())