ค้นหาเว็บไซต์

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 จะรอจนกระทั่งคำสั่งลำดับสุดท้ายถูกประมวลผล