TL; DR: Более строгие проверки типов, введенные в TypeScript 2.4, несовместимы с RxJS <5.4.2 (<a href="https://github.com/ReactiveX/rxjs/pull/2722" rel="nofollow noreferrer"> из-за ошибки ). Ваша IDE, вероятно, использует TypeScript> = 2.4 для проверки типов. Либо обновите RxJS (рекомендуется), либо понизьте TypeScript, либо используйте программное решение Subject.asObservable
вместе с типом возврата Observable<boolean>
.
Пояснение:
После обсуждения я изучил исходный код RxJS 5.3.0 и обнаружил, что подписи lift
отличаются между Subject
и Observable
. В частности, мы можем увидеть следующую разницу:
Subject.ts:
lift<R>(operator: Operator<T, R>): Observable<T>
Observable.ts:
lift<R>(operator: Operator<T, R>): Observable<R>
Общий тип возвращаемого наблюдаемого: T в Subject
, но R в Observable
.
Оператору first()
требуется Observable
для его контекста this
, который не может быть сопоставлен с Subject
из-за несовпадающих сигнатур lift
. Это очень странно для меня, поскольку Subject
расширяет Observable
и поэтому должно иметь соответствующие сигнатуры для всех его свойств.
Теперь вот решение: TypeScript ввел более строгие проверки типов с версией 2.4, и RxJS действительно нужно было отследить это изменение, изменив сигнатуру метода lift
. Это изменение можно увидеть в журнале изменений в версии 5.4.2 .:
Тема: подпись лифта теперь подходит для более строгих проверок TypeScript 2.4
Вот соответствующий вопрос . Кажется, это была ошибка.
Вы используете RxJS 5.3 , поэтому вы получаете сообщение об ошибке.
Есть два варианта. Обновите RxJS (рекомендуется) или используйте Subject.asObservable
, чтобы изменить тип с Subject
на Observable
.
Как уже упоминалось в моем комментарии, тип возвращаемой функции должен также измениться на Observable<boolean>
.
Наносится на ваш отрубленный, это должно выглядеть так:
public confirm(prompt: string): Observable<boolean> {
// ...set up a confirmation dialog...
this.response$ = new Subject<boolean>();
return this.response$.asObservable().first();
}
Я вижу, что ваша версия TypeScript 2.2 , но вполне возможно, что ваша IDE использует другую версию TypeScript для проверки типов.
Alternative
Как упомянуто @cartant, Subject.lift
реализован так, чтобы возвращать Subject
, но это не может быть выражено с типами TypeScript (нет перегрузки возвращаемого типа, даже если нет уверенности, что есть язык, поддерживающий это).
Итак, еще одно решение - игнорировать проверки типов, приведя к <any>
. Таким образом, вы также можете вернуть Subject
.