代码之家  ›  专栏  ›  技术社区  ›  Nate May

defer()不再允许可观察的返回类型

  •  3
  • Nate May  · 技术社区  · 7 年前

    与此同时,我不得不将rxjs从6.1.0升级到6.3.3,并将typescript从2.7.2升级到3.1.1

    现在这个ngrx effects方法抛出了一个typescript错误:

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

    类型为“()=”的参数;可观察的|可观察的'不是

    似乎我再也不能使用defer来分派这样的操作了,所以我不确定如何继续编写初始化效果。

    有人知道我怎么解决这个问题吗?

    更新:

    Stackblitz ROOT_EFFECTS_INIT ,但由于我在一个功能模块中,这不起作用( discussed here )

    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 回复  |  直到 7 年前
        1
  •  9
  •   cartant    7 年前

    这是TypeScript限制。可以通过在arrow函数中显式指定返回类型来解决此问题:

    @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());
    });
    

    问题是,如果没有显式返回类型,arrow函数的返回类型将被推断为:

    Observable<Login> | Observable<Logout>
    

    而不是:

    Observable<Login | Logout>
    

    this RxJS PR 将解决问题,并将看到正确的类型。