【发布时间】:2019-10-08 13:15:20
【问题描述】:
当我的组件加载时,我需要使用两个服务。两者都需要在继续有意义之前完成。这些完成的顺序是随机的,不应该连续组成。设置遵循以下模式。
const observables = [
this.donkeyService.getDonkey(),
this.monkeyService.getMonkey()
];
combineLatest(observables)
.subscribe(([donkeyResult, monkeyResult]) => {
if (!!donkeyResult && !!monkeyResult) {
...
}
}
我们注意到输入的结果未按预期输入。我们花了一段时间才意识到这一点,但是 donkeyResult 的类型不是 Donkey,尽管下面定义了服务器!
getDonkey() : Observable<Donkey> { ... }
最后,我意识到当元素被传递到接收数组时,它们会失去它们的类型,因为数组本身是 any[]。所以我们使用强制转换来管理它,如下所示。
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) {
...
}
}
我想重构代码,以便该数组将保留服务方法签名指定的类型,并且不会合并成一个共同点任何。
是否可以让 TypeScript 和/或 Rxjs 有一个数组,其中第一个元素是 Donkey,第二个元素是 Monkey?我可以使用与数组不同的数据结构吗?
我尝试了(当然失败了)一堆不同的方法,包括像这样直接在数组中强制转换类型。
...
.subscribe(([_1 as Donkey, _2 as Monkey]) => { ... }
有没有一种巧妙的方法来保持类型?我们对完全改变方法持开放态度,因为我们拥有这部分软件并有一些额外的时间来修改代码。
【问题讨论】:
-
我想到的第一件事是将数组映射到另一个对象,例如
map([donkey, monkey] => { return { donkey: donkey, monkey: monkey } as {donkey: Donkey, monkey: Monkey}; })。您仍然需要自己进行映射 -
想知道您是否尝试过以下任一...
.subscribe(([(_1 as Donkey), (_2 as Monkey)]) => { ... }...或....subscribe(([<Donkey>_1, <Monkey>_2]) => { ... }。 -
添加到上述答案,
combineLatest<[Donkey, Monkey]>>(observables) .subscribe(([_1, _2]) => { const donkeyResult = _1; const monkeyResult = _2; if (!!donkeyResult && !!monkeyResult) { ... } }
标签: angular typescript rxjs combinelatest