【问题标题】:RxJs6: OperatorFunction vs MonoTypeOperatorFunctionRxJs6:OperatorFunction 与 MonoTypeOperatorFunction
【发布时间】:2021-02-01 17:41:19
【问题描述】:

我有以下代码:

export class EventsChainComponent { 
    eventSubscriber:Subscription;

    constructor (protected eventService: EventService) {}


    public registerComponentsEvent(event:any) {
        // getOnEvent signature
        // (method) EventService.getOnEvent(): Observable<FormEvent>
        this.eventSubscriber = this.eventService.getOnEvent()
            .pipe(filter((formEvent: FormEvent) => {return formEvent.key == event.event}))
            .subscribe((formEvent: FormEvent) => {
                  ..........
            });
    }

当我编译时,编译器返回以下错误:

“MonoTypeOperatorFunction”类型的参数不能分配给“OperatorFunction”类型的参数。

所以,我搜索了一下,我找到了RxJs6 运算符过滤器 API:

export declare function filter<T, S extends T>(predicate: (value: T, index: number) => value is S, thisArg?: any): OperatorFunction<T, S>;
export declare function filter<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): MonoTypeOperatorFunction<T>;

如您所见,过滤器有 2 个重载方法,一个返回 OperatorFunction,另一个返回 MonoTypeOperatorFunction

谁能告诉我这两种类型的区别?有谁知道我该如何解决这个错误?

注意:FormEvent 类是我创建的,EventServiceEventsChainComponent 具有相同的导入,引用同一个类。

【问题讨论】:

  • 你在输入eventSubscriber吗?
  • MonoTypeOperatorFunction&lt;T&gt; 等价于OperatorFunction&lt;T,T&gt;
  • @Phix 我更改了问题,以便您了解有关我的代码的更多信息。
  • @cartant 如果它是等价的,为什么编译器会给出这样的错误?
  • 它应该是可分配的,但您的问题中没有足够的信息来提供理由。您需要显示源 observable 的类型。如果您在传递给filter 的箭头函数中明确说明了要键入的不同类型,则它必须是。

标签: angular typescript rxjs6


【解决方案1】:

对于其他有此问题的人:

我有同样的问题。就我而言,问题出在 Event 对象上。

rxjs 和 angular/router 都有一个事件对象,因此存在名称冲突。 我为解决这个问题所做的就是用不同的名称声明 @angular/router 事件,然后相应地使用。

{Event as RouterEvent} from '@angular/router';

之后:当我想使用 rxjs.Event 时我使用Event,当我想使用@angular/router.Event 时我使用RouterEvent。 错误消失了:)

希望对你有帮助

【讨论】:

    【解决方案2】:

    在下面的comment 之后,我发现问题是我从相同的文件名导入了类,但是我在不同的文件夹中,在 src 文件夹下有相同的文件。

    MonoTypeOperatorFunction&lt;T&gt; 不可分配给的唯一方法 OperatorFunction&lt;T,T&gt; 是如果类型参数 - Ts - 是 不同的。说函数返回Observable&lt;FormEvent&gt; 评论不是特别有用。 FormEvent 事件从何而来 从?它与您在该文件中使用的 FormEvent 相同吗?是吗 一类?谁知道?不是我。我的猜测是你有两个 FormEvent 来自不同库的类。或相同的不同安装 图书馆。

    我所做的是删除其中一个文件,错误消失了。

    【讨论】:

      【解决方案3】:

      上述解决方案对我不起作用...我找到了这个

      filter((event): event is ActivationEnd => event instanceof ActivationEnd)
      

      归功于 https://gitmemory.com/issue/ReactiveX/rxjs/4947/518146427

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 2019-06-21
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2020-03-24
        • 2018-12-19
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多