【问题标题】:Observable.forkJoin() TS2322 error after updating to TypeScript 2.4.1 and Rxjs 5.4.2更新到 TypeScript 2.4.1 和 Rxjs 5.4.2 后 Observable.forkJoin() TS2322 错误
【发布时间】:2017-11-30 02:14:45
【问题描述】:

在我们的 Angular 4.2.4 应用程序中,我们在许多地方使用 RxJS 的 Observable.forkJoin 来返回异构类型。

例如:

private fleet: Aircraft[];
private contractList: string[];

Observable.forkJoin([
  this.fleetService.getFleet(),
  this.fleetService.getContractList()
]).subscribe(
  next => {
    this.fleet = results[0];
    this.contractList = results[1];
  },
  error => console.error
);

具有以下服务签名:

getFleet(): Observable<Aircraft[]> { ... }
getContractList(): Observable<string[]> { ... }

更新到 TypeScript 2.4.1 后,tsc 现在抱怨 this.contractList 出现以下错误:

./app/fleet/fleetComponent.ts (xx,xx) 中的错误: 错误 TS2322:类型 'Aircraft[]' 不可分配给类型 'string[]'。

但我不想将Aircraft[] 分配给string[]

所有我们实现的其他 Observable.forkJoin 也是如此:result[] 中的所有元素都被视为与 result[0] 相同的类型。

似乎与Error with Actions observable in @ngrx/effects using TypeScript 2.4.1 中的问题非常相似,但在tsconfig.js 的"compilerOptions" 中添加"noStrictGenericChecks": true, 并没有解决问题。

为什么会这样?我该如何解决这个问题?

【问题讨论】:

    标签: typescript rxjs5 typescript2.4


    【解决方案1】:

    您可能会看到 Typescript 编译器对泛型的强制执行增加了,副作用是 forkJoin 没有 tuple 重载。

    将数组符号从参数列表中删除到 forkJoin 应该可以,但是:

    Observable.forkJoin(
      this.fleetService.getFleet(),
      this.fleetService.getContractList()
    ).subscribe(
      next => {
        this.fleet = results[0];
        this.contractList = results[1];
      },
      error => console.error
    );
    

    【讨论】:

    • 太棒了!我什至不知道您可以将列表传递给forkJoin()。这确实解决了问题,我很欣赏tuple 的解释。
    【解决方案2】:

    注意:我认为最好使用combineLatest 作为combineLatest 获取并尽快返回数据,但forkJoin 将等到最后一个链命令执行。

    【讨论】:

    • 这是两种截然不同的用途
    猜你喜欢
    • 2018-10-17
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多