rxjs ожидает объединение типа при внутреннем отображении switchMap - PullRequest
1 голос
/ 02 апреля 2019

Демо здесь

switchMap(innerHello => {
    return of(world).pipe(map(innerWorld => [innerHello, innerWorld]));
}),
map(([hello, world]) => {
  console.log('result', hello.hello, world.world);
})

Почему при использовании оператора switchMap появляется предупреждение о том, что property hello does not exist on type Hello | World.
Я возвращаю массив из внутренней карты, так почему он ожидает объединения?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Предполагаемый тип [innerHello, innerWorld] равен Array<Hello|World>, вы не можете получить доступ к свойствам, которые не относятся к обоим типам.

Что вы можете сделать, так это явно набрать ваш массив как

map(([hello, world]: [Hello, World]) => {
  console.log('result', hello.hello, world.world);
})
1 голос
/ 02 апреля 2019

Как уже упоминалось в другом ответе, машинописный текст выводит тип объектов в массиве как тип объединения 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. Обратите внимание, что в этом случае вы «привязаны» к именам свойств, используемых для создания объекта результата, а не к их порядку .

Рабочая демоверсия в этом блице

0 голосов
/ 02 апреля 2019

Я возвращаю массив из внутренней карты, так почему он ожидает объединения?

Это то, что вы явно сказали ему ожидать:

  console.log('result', hello.hello, world.world);

Итак, "получить доступ к свойству hello объекта hello (или: 0-й элемент массива) и получить доступ к свойству world объекта world".

Измените его на console.log('result', hello, world).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...