2017-07-10 29 views
2

在我們的角度4.2.4應用程序中,我們在許多地方使用RxJS的Observable.forkJoin來返回異構類型。Observable.forkJoin更新到TypeScript 2.4.1和Rxjs後的TS2322錯誤5.4.2

例如:

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[]> { ... } 

更新現在打字稿2.4.1tsc後與以下錯誤抱怨爲this.contractList

錯誤在./app/fleet /fleetComponent.ts(xx,xx): 錯誤TS2322:類型'Aircraft []'不能分配給'string []'類型。

但我並不想將Aircraft[]分配給string[]

同樣是真實的所有其他Observable.forkJoin我們實現了:就好像它們是同一類型result[0]result[]所有元素進行處理。

它似乎與Error with Actions observable in @ngrx/effects using TypeScript 2.4.1中的問題非常相似,但是向tsconfig.js的"compilerOptions"添加"noStrictGenericChecks": true,並未解決問題。

這是怎麼發生的?我怎樣才能解決這個問題?

回答

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 
); 
+0

太棒了!我甚至不知道你可以將一個列表傳遞給'forkJoin()'。這確實解決了這個問題,並且我很欣賞'tuple'的解釋。 – msanford

1

注:我認爲這是更好地使用combineLatestcombineLatest獲取和使用,儘快恢復數據,但forkJoin會等到最後的鏈式命令執行。