我怎样才能重构这一点:
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
答案 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()
问题是:
现在在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())