defer () больше не допускает наблюдаемый тип возврата - PullRequest
0 голосов
/ 20 октября 2018

Сегодня я сделал обновление с угловой 6 до 7

Наряду с этим мне пришлось обновить rxjs с 6.1.0 до 6.3.3 и набрать текст с 2.7.2 до 3.1.1

И теперь этот метод эффектов ngrx выдает ошибку машинописного текста:

  @Effect()
  init$ = defer(() => {
    const userData = localStorage.getItem('user');
    return (userData)
      ? of(new Login(JSON.parse(userData)))
      : of(new Logout());
  });

Аргумент типа '() => Observable |Наблюдаемый 'нельзя назначить параметру типа' () => void |По подписке |По подписке |PromiseLike |InteropObservable '.

Кажется, что я больше не могу использовать defer для отправки действия, подобного этому, поэтому я не уверен, как написать эффекты инициализации, двигаясь вперед.

Мне просто нужно дождаться инициализации хранилища, поэтому в этом методе я откладываю выполнение до тех пор, пока эффекты не подпишутся на поток действий.

Кто-нибудь знает, какЯ могу обойти это?

ОБНОВЛЕНИЕ:

Я также нашел Stackblitz пример, который использует ROOT_EFFECTS_INIT, но из-за того, что я вфункциональный модуль, это не работает ( обсуждается здесь )

import { ROOT_EFFECTS_INIT } from '@ngrx/effects';

@Effect()
  init$ = this.actions$
    .ofType(ROOT_EFFECTS_INIT)
    .pipe(
      map(() => {
        const userData = localStorage.getItem('user');
        return (userData)
          ? of(new Login(JSON.parse(userData)))
          : of(new Logout())
      })
    );

1 Ответ

0 голосов
/ 20 октября 2018

Это ограничение TypeScript.Вы можете обойти эту проблему, явно указав тип возвращаемого значения в функции стрелки:

@Effect()
init$ = defer((): Observable<Action> => { // HERE
  const userData = localStorage.getItem('user');
  return (userData)
    ? of(new Login(JSON.parse(userData)))
    : of(new Logout());
});

Или, более конкретно:

@Effect()
init$ = defer((): Observable<Login | Logout> => { // HERE
  const userData = localStorage.getItem('user');
  return (userData)
    ? of(new Login(JSON.parse(userData)))
    : of(new Logout());
});

Проблема заключается в том, что без явного возвращаемого типатип возвращаемого значения функции стрелки:

Observable<Login> | Observable<Logout>

, а не:

Observable<Login | Logout>

Интересно, что хотя это действительно ограничение TypeScript, thisRxJS PR решит проблему и увидит правильный тип.

...