在<T> Angular 下使用 rxjs 中的 combineLatest() 保留多路可观察的类型?



当我的组件加载时,我需要使用两个服务。两者都需要在继续之前完成。这些完成顺序是随机的,不应串行组成。设置遵循下面的模式。

const observables = [
  this.donkeyService.getDonkey(),
  this.monkeyService.getMonkey()
];
combineLatest(observables)
  .subscribe(([donkeyResult, monkeyResult]) => {
    if (!!donkeyResult && !!monkeyResult) {
      ...
    }
  }

我们注意到结果未按预期输入。我们花了一段时间才意识到它,但是 donkeyresult 的类型不是 donkey ,尽管以下服务器的定义!

getDonkey() : Observable<Donkey> { ... }

最后,我意识到,当元素传递到接收数组时,它们会失去打字,因为阵列本身是任何[] 。因此,我们使用以下铸件对其进行管理。

const observables = [
  this.donkeyService.getDonkey(),
  this.monkeyService.getMonkey()
];
combineLatest(observables)
  .subscribe(([_1, _2]) => {
    const donkeyResult = _1 as Donkey;
    const monkeyResult = _2 as Monkey;
    if (!!donkeyResult && !!monkeyResult) {
      ...
    }
  }

我想重新分配代码,以便数组保留服务方法签名指定的类型,并且不会合并为一个共同的分母任何。。

可以使打字稿和/或rxjs具有一个数组,其中第一个元素将是 donkey 和第二 monkey ?我可以使用与数组不同的数据结构吗?

我尝试了(当然是失败的(一堆不同的方法,包括通过直接在数组中施放类型的方式。

...
.subscribe(([_1 as Donkey, _2 as Monkey]) => { ... }

是否有保留打字的整洁方法?我们愿意完全改变该方法,因为我们拥有软件的这一部分,并有一些额外的时间按摩代码。

首先,您必须键入功能和HTTP调用。

getMonkey(): Observable<Donkey> {
  return this.http.get<Donkey>(url);
}

完成后,您必须键入可观察到的数组:

const observables: [Monkey, Donkey] = [
  this.getMonkey(),
  this.getDonkey(),
];

最后,尽管没有必要,您可以输入回调参数:

forkJoin(observables).subscribe(([monkey, donkey]: [Monkey, Donkey]) => {...});

这听起来像是元组的用例。https://visualstudiomagazine.com/articles/2016/02/01/type-safe-scruptures.aspx?m=1

type animalTuple = [Donkey, Monkey];
.subscribe(([donkeyResult, monkeyResult]: animalTuple) => { ... }

最新更新