Как уже упоминалось в другом ответе, машинописный текст выводит тип объектов в массиве как тип объединения World|Hello
, поэтому вы не сможете получить доступ к необычным свойствам между классами без использования некоторая форма типа охранник .
Ответ, предоставленный @David, в порядке, , но он вынуждает вас привести тип массива .
Обратите внимание, что это прекратится без предупреждений компилятора в случае, если вы измените порядок, в котором вы добавляете объекты в массив во время его создания. (Например: [innerHello, innerWorld]
в [innerWorld, innerHello]
).
Еще один способ подойти к этому, оставить проверки типов без приведения типов и, следовательно, улучшить поддержку компилятора, - это собрать свойства в простой объект и затем деструктурировать его:
const helloVal: Hello = {
hello: 'hello'
};
const worldVal: World = {
world: 'world'
};
const source = of(helloVal).pipe(
switchMap(hello => of(worldVal).pipe(map(world => ({ hello, world }))))
);
source.subscribe(({ hello, world }) => {
console.log('result', hello.hello, world.world);
});
В этом случае типы hello
и world
правильно выводятся в обратном вызове subscribe
. Обратите внимание, что в этом случае вы «привязаны» к именам свойств, используемых для создания объекта результата, а не к их порядку .
Рабочая демоверсия в этом блице