gpt4 book ai didi

angular - 使用 rxjs 和 Angular 的 combineLatest() 保留多个 Observable 的类型?

转载 作者:太空狗 更新时间:2023-10-29 18:14:35 26 4
gpt4 key购买 nike

当我的组件加载时,我需要使用两个服务。两者都需要完成才能继续。这些的完成顺序是随机的,不应该连续组成。设置遵循以下模式。

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 拥有一个数组,其中第一个元素是一只,第二个是猴子?我可以使用不同于数组的数据结构吗?

我尝试了(当然失败了)许多不同的方法,包括通过像这样直接在数组中转换类型来胡闹。

...
.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]) => {...});

关于angular - 使用 rxjs 和 Angular 的 combineLatest() 保留多个 Observable<T> 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56250218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com