我有一个包含 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 []))
,但我想必须有更好的方法。
如果有人知道如何实现我的目标,我将不胜感激。如果可能的话,我更喜欢基于第一种方法的解决方案,但如果这是不可能的,那么第二种方法中的解决方法的替代方案也很棒。
提前致谢,祝您本周休息愉快
使用
Function.prototype.bind()方法确保使用正确的
pipe
上下文调用您的 this
方法:
public get pipe() {
return this.subject.pipe.bind(this.subject);
^^^^^^^^^^^^^^^^^^^^^
}