更新到TypeScript 2.4.1和Rxjs 5.4.2

时间:2017-07-10 19:34:59

标签: typescript rxjs5 typescript2.4

在我们的角度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:键入&#39;飞机[]&#39;不能指定为&#39; string []&#39;。

但我并没有尝试将Aircraft[]分配给string[]

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

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

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

2 个答案:

答案 0 :(得分:7)

您可能会看到从一般情况下的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
);

答案 1 :(得分:0)

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