添加方法到RxJs 6订阅原型

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

使用rxjs @ 5,我们实现了一个方便的DisposeBag类来收集Subscriptions,并在销毁Angular组件时更容易取消订阅。

import { Subscription } from "rxjs/Subscription";

export class DisposeBag {
    private _subscription: Subscription[] = [];

    insert(subscription: Subscription): void {
        this._subscription.push(subscription);
    }

    dispose() {
        this._subscription.forEach(subscription => {
            subscription.unsubscribe();
        });
        this._subscription = [];
    }
}

export function disposedBy(this: Subscription, bag: DisposeBag): void {
    bag.insert(this);
}

Subscription.prototype.disposedBy = disposedBy;

declare module "rxjs/Subscription" {
    interface Subscription {
        disposedBy: typeof disposedBy;
    }
}

升级到rxjs @ 6 + rxjs-compat @ 6,我们得到以下编译错误:

(12) Property 'unsubscribe' does not exist on type 'Subscription'. (22) 'Subscription' only refers to a type, but is being used as a value here.

将第一次导入切换为

import { Subscription } from "rxjs";

解决了这两个错误但引入了(22) Property 'disposedBy' does not exist on type 'Subscription'.错误。

我们该如何解决这个问题?

angular rxjs rxjs6
1个回答
3
投票

感谢this的回答,我能够解决这个问题:

import { Subscription } from "rxjs";

export class DisposeBag {
    private _subscription: Subscription[] = [];

    insert(subscription: Subscription): void {
        this._subscription.push(subscription);
    }

    dispose() {
        this._subscription.forEach(subscription => {
            subscription.unsubscribe();
        });
        this._subscription = [];
    }
}

export function disposedBy(this: Subscription, bag: DisposeBag): void {
    bag.insert(this);
}

Subscription.prototype.disposedBy = disposedBy;

declare module "rxjs/internal/Subscription" {
    interface Subscription {
        disposedBy: typeof disposedBy;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.