У меня есть 2 наблюдаемые.Первый излучает numbers
, второй - strings
.
Эти 2 наблюдаемые начинают излучаться, когда излучают некоторые триггеры.Триггеры - это субъекты, и у каждого из 2 наблюдаемых есть свой собственный триггер.
Я хочу начать race
между двумя наблюдаемыми, чтобы наблюдаемый, триггер которого испускал первые победы, начинал излучать, а другой -игнорируется, даже если впоследствии запускается его триггер.
Это код
const observableOfNumber = interval(100).pipe(take(10));
const observableOfNumberFunction = () => observableOfNumber;
const observableOfString = interval(100).pipe(map(number => String.fromCharCode(65 + number)), take(10));
const observableOfStringFunction = () => observableOfString;
const startEmittingNumbers = new Subject<any>()
const emittingNumbers = startEmittingNumbers
.pipe(
map(() => observableOfNumberFunction),
);
const startEmittingChars = new Subject<any>()
const emittingChars = startEmittingChars
.pipe(
map(() => observableOfStringFunction),
);
race(emittingNumbers, emittingChars)
.pipe(
mergeMap(handler => handler())
)
.subscribe(console.log);
Этот код заставляет Typescript жаловаться на следующую ошибку
![enter image description here](https://i.stack.imgur.com/ZX72s.png)
Код, похоже, работает нормально по своей сути.
Если я просто явно объявляю тип возвращаемого значения observableOfStringFunction
как Observable<any>
, то есть
const observableOfStringFunction = (): Observable<any> => observableOfString;
Typescript перестает жаловаться, и все работает отлично.
Аналогично, есливместо использования race
я использую merge
, Typescript не жалуется, даже если с точки зрения проверки типов merge
и race
должны вести себя одинаково.
Может кто-нибудь указать мнек причине этого другого поведения?