在我们的角度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"
没有解决问题。
为什么会这样?我该如何解决这个问题?
答案 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
将等到最后一个链命令执行。