Свойство 'connect' не существует для типа 'Observable <any>' | RXJS многоадресная рассылка - PullRequest
0 голосов
/ 19 января 2019

У меня есть Observable, который производит одноадресное значение (индивидуально для всех наблюдателей). Но когда я собираюсь преобразовать в многоадресную рассылку, используя операторы многоадресной рассылки RxJs, она возвращает следующую ошибку.

Свойство 'connect' не существует для типа 'Observable'

Unicast (рабочий код) -

let source4$ = interval(1000).pipe(take(4));

source4$.subscribe(val => {
    console.log(`Observer 1: ${val}`);
});

setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 2: ${val}`);
    }); 
}, 1000);
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 3: ${val}`);
    }); 
}, 2000);

Multicast (не рабочий код) -

let source4$ = interval(1000).pipe(take(4), multicast(new Subject()));

source4$.subscribe(val => {
    console.log(`Observer 1: ${val}`);
});

setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 2: ${val}`);
    }); 
}, 1000);
setTimeout(function() {
    source4$.subscribe(val => {
        console.log(`Observer 3: ${val}`);
    }); 
}, 2000);

source4$.connect();

1 Ответ

0 голосов
/ 20 января 2019

Вы на самом деле здесь правы.Оператор multicast действительно возвращает экземпляр ConnectableObservable (https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/multicast.ts#L54).

. Это просто проблема с типами TypeScript, где pipe() всегда возвращает только Observable: (https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts#L301-L311).

Об этом сообщалось, и на странице GitHub RxJS есть открытая проблема: https://github.com/ReactiveX/rxjs/issues/2972

Самый простой обходной путь - принудительно переопределить возвращенный Observable:

const source4$ = interval(1000).pipe(...) as ConnectableObservable<number>
...