Observable.forkJoin() 更新到 TypeScript 2.4.1 和 Rxjs 5.4.2 后出现 TS2322 错误

Observable.forkJoin() TS2322 error after updating to TypeScript 2.4.1 and Rxjs 5.4.2

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

例如:

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 的以下错误:

ERROR in ./app/fleet/fleetComponent.ts (xx,xx): error TS2322: Type 'Aircraft[]' is not assignable to type 'string[]'.

但我并不是要将 Aircraft[] 分配给 string[]

对于 all 我们实现的另一个 Observable.forkJoin 也是如此:result[] 中的所有元素都被视为与 result[0].

看起来与中的问题非常相似,但是将"noStrictGenericChecks": true,添加到tsconfig.js'"compilerOptions"中并没有解决问题。

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

您可能看到 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
);

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