RXJS 主题包装器的问题

问题描述 投票:0回答:1

我有一个包含 RXJS 主题的类,我想在该类上添加一个简写,以允许管道或订阅,而无需直接访问主题,但我在使其工作时遇到了一些问题。

这是我的类的基本版本(完整的代码更复杂,但这允许最小限度的复制):

class Wrapper:
  private subject = new Subject<string>();

我尝试了两种解决方案,但都不起作用。为了示例,我将仅引用管道,但在尝试包装订阅时也会出现相同的问题。

第一个是使用 getter,它只是返回对主题管道的引用。

public get pipe() {
  return this.subject.pipe;
}

但是,当我这样做时,一旦添加任何运算符(例如,

TypeError: Unable to lift unknown Observable type
),我就会收到以下错误
new Wrapper().pipe(tap(console.log))

我的第二次尝试包括在函数内调用主题的管道,以复制原始的行为,如下所示:

public pipe(...operators: OperatorFunction<any, any>[]) {
  return this.subject.pipe(...operators);
}

尝试此操作时,我收到以下编译错误

A spread argument must either have a tuple type or be passed to a rest parameter
。我已经设法通过像这样转换操作符参数来找到解决方法
this.subject.pipe(...(operators as []))
,但我想必须有更好的方法。

如果有人知道如何实现我的目标,我将不胜感激。如果可能的话,我更喜欢基于第一种方法的解决方案,但如果这是不可能的,那么第二种方法中的解决方法的替代方案也很棒。

提前致谢,祝您本周休息愉快

angular typescript rxjs subject
1个回答
0
投票

使用

Function.prototype.bind()
方法确保使用正确的
pipe
上下文调用您的 this 方法:

public get pipe() {
  return this.subject.pipe.bind(this.subject);
                          ^^^^^^^^^^^^^^^^^^^^^
}
© www.soinside.com 2019 - 2024. All rights reserved.