当我的组件加载时,我需要使用两个服务。两者都需要在继续之前完成。这些完成顺序是随机的,不应串行组成。设置遵循下面的模式。
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) => { ... }