Angular 使用lettable publishLast运算符时如何获得可连接的可观察性

Angular 使用lettable publishLast运算符时如何获得可连接的可观察性,angular,rxjs,Angular,Rxjs,如何重构这一点: const warmObservable = this.httpClient.get<Result[]>(url).publishLast(); warmObservable.connect(); const warmObservable=this.httpClient.get(url.publishLast(); warmObservable.connect(); 可出租运营商 当我使用: const warmObservable = this.h

如何重构这一点:

  const warmObservable = this.httpClient.get<Result[]>(url).publishLast();
  warmObservable.connect();
const warmObservable=this.httpClient.get(url.publishLast();
warmObservable.connect();
可出租运营商

当我使用:

  const warmObservable = this.httpClient.get<Result[]>(url).pipe(publishLast());
  warmObservable.connect();
const warmObservable=this.httpClient.get(url).pipe(publishLast());
warmObservable.connect();
我得到一个错误:

类型“Observable”上不存在属性“connect”。


使用的版本:rxjs@5.5.2管道
方法总是返回
可观察的
,如下所示:

所以你需要自己打字

const warmObservable = this.httpClient.get<Result[]>(url).pipe(publishLast()) as ConnectableObservable;
warmObservable.connect();
const warmObservable=this.httpClient.get(url).pipe(publishLast())作为可连接的可观察对象;
warmObservable.connect();
来自rxjs 5.5源代码(rxjs/util/pipe.ts),带有一个操作符的
管道的签名是

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

  • 它是一个版本吗(适用于5.5.2)
  • 这是一个有棱角的东西吗
  • 这是一件重要的事情吗

从参考号:

Observable.prototype.pipe中有一个内置于Observable中的管道方法,可用于以与点链接(如下所示)类似的方式组合操作符

rxjs/util/pipe中还有一个管道实用程序函数,可用于从其他可出租操作符构建可重用的可出租操作符

util
版本是适合我的版本,可能需要单独导入
rxjs/util/pipe

差不多

import { pipe } from 'rxjs/util/pipe'

最佳结论

问题似乎在于当前分发的打字文件
Observable.d.ts
,该文件将返回值键入
Observable

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

我不确定这是否可以归类为一个bug,但无论如何,一个解决方法是通过强制转换绕过
可观察的.d.ts
,例如

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

当我点击
pipe
方法时,它会导航到
pipe(op1:OperatorFunction):可观察
内部
node\u modules\rxjs\Observable.d.ts
您导航到的d.ts可能是错误消息的原因。实际运行时
Observable.js
可以工作,这可以从CodePen中看到(它使用管道实用程序函数)。所以,最有可能的解决方法是@martins类型的演员阵容。我现在不能测试它,你自己是怎么工作的?