rxjs5 - ข้อผิดพลาด Observable.forkJoin() TS2322 หลังจากอัปเดตเป็น TypeScript 2.4.1 และ Rxjs 5.4.2
ในแอปพลิเคชัน Angular 4.2.4 ของเรา เราใช้ Observable.forkJoin ของ RxJS ในหลาย ๆ ที่เพื่อส่งคืนชนิดข้อมูลที่หลากหลาย
ตัวอย่างเช่น:
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]
มันดูเหมือนกับปัญหาในข้อผิดพลาดกับ Actions observable ใน @ngrx/effects ที่ใช้ TypeScript 2.4.1 แต่การเพิ่ม "noStrictGenericChecks": true, ใน "compilerOptions" ของ tsconfig.js ก็ไม่สามารถแก้ปัญหาได้
ทำไมสิ่งนี้ถึงเกิดขึ้น? ฉันจะแก้ไขมันได้อย่างไร?
คำตอบ #1
คุณอาจกำลังเห็นการบังคับใช้ที่เพิ่มขึ้นจากคอมไพเลอร์ Typescript เกี่ยวกับ generics ผลข้างเคียงคือ forkJoin ไม่มีการโอเวอร์โหลดแบบ tuple
การลบโน้ตาชันของอาเรย์จากรายการพารามิเตอร์ไปยัง forkJoin ควรใช้งานได้ อย่างไรก็ตาม:
Observable.forkJoin(
this.fleetService.getFleet(),
this.fleetService.getContractList()
).subscribe(
next => {
this.fleet = results[0];
this.contractList = results[1];
},
error => console.error
);
คำตอบ #2
หมายเหตุ: ผมคิดว่าจะดีกว่าถ้าใช้ combineLatest เพราะ combineLatest จะดึงข้อมูลและส่งคืนทันทีที่มีข้อมูลพร้อม แต่ forkJoin จะรอจนกระทั่งคำสั่งลำดับสุดท้ายถูกประมวลผล
