Angular Rxjs型可观测<;未知>;不可分配给可观察对象<;无效>;

Angular Rxjs型可观测<;未知>;不可分配给可观察对象<;无效>;,angular,typescript,rxjs,Angular,Typescript,Rxjs,我正在从5升级到RXJSV6,我还将我的typescript版本从2.9.2升级到3.7.4。在我的一个angularjs组件中,我调用了一个返回承诺的服务。为了便于使用,我使用from rxjs函数将其转换为组件中的可观察值。我的代码是这样的(名称从原来的更改) saveObject(名称:字符串):可观察{ 归来( this.myService.saveMyObject(名称) .然后(()=>{ //在ui上显示保存成功 返回; }), ) .烟斗( catchError((错误)=>{

我正在从5升级到RXJSV6,我还将我的typescript版本从2.9.2升级到3.7.4。在我的一个angularjs组件中,我调用了一个返回承诺的服务。为了便于使用,我使用from rxjs函数将其转换为组件中的可观察值。我的代码是这样的(名称从原来的更改)

saveObject(名称:字符串):可观察{
归来(
this.myService.saveMyObject(名称)
.然后(()=>{
//在ui上显示保存成功
返回;
}),
)
.烟斗(
catchError((错误)=>{
//错误处理逻辑
返回();//此位是试图修复此问题
}),
);
}
我遇到的问题是,组件中的saveObject函数返回一个可观察的void,承诺最终解决为void,但当我尝试返回可观察的时,我得到一个错误,表示可观察的不可分配给可观察的。为什么typescript/rxjs推断类型是未知的,除了执行类型断言以获得正确的类型之外,我还能做些什么

编辑:完全删除管道并不能解决问题,只需from(promise)就足以得到错误,不幸的是,即使这样做来告诉rxjs这是一个void承诺也没有帮助,它仍然提供相同的错误

from<Promise<void>>(//promiseCode)
from(//promiseCode)
尝试return
of()
来完成可观察的,看看它是否有效

from(this.myService.saveMyObject(name))
.pipe(
    mergeMap(()=>of()),
    catchError((error) => {
        // error handling logic
        return of(); // this bit was an attempt to fix the problem
    }),
);
这是因为操作符要求您返回一个可观察的。如文件所述,catchError()

你需要返回一个可观察的

:warning: Remember to return an observable from the catchError function!
saveObject(name: string): Observable<void> {
  return from(
    this.myService.saveMyObject(name)
            .then(() => {
                //Show Save success on ui
                return;
        }),
    )

}

this.saveObject.subscribe((res) => {
  // handle success
}, (error) => { 
  // handle errors, without the need to return an observable
});
如果您不想返回一个可观察对象,那么使用catchError操作符的另一种方法是在订阅该可观察对象时处理错误回调上的错误

:warning: Remember to return an observable from the catchError function!
saveObject(name: string): Observable<void> {
  return from(
    this.myService.saveMyObject(name)
            .then(() => {
                //Show Save success on ui
                return;
        }),
    )

}

this.saveObject.subscribe((res) => {
  // handle success
}, (error) => { 
  // handle errors, without the need to return an observable
});
saveObject(名称:字符串):可观察{
归来(
this.myService.saveMyObject(名称)
.然后(()=>{
//在ui上显示保存成功
返回;
}),
)
}
this.saveObject.subscribe((res)=>{
//成功
},(错误)=>{
//处理错误,而不需要返回可观察的
});

在rxjs团队的帮助下,我发现这是因为我需要在Tconfig文件中包含此选项


    "lib": ["es2015"],


我正在用of()返回catchError()中的可观察值,我尝试了of(),但这并没有解决问题。在进行另一次检查后,它似乎根本不在管道中,完全移除管道并不能解决问题。@LachlanD抱歉,你这是什么意思。。?您是说错误没有在
catchError
中传播?哦,很抱歉澄清,我完全删除了管道,所以我刚刚从(myPromise)返回,但我仍然收到与以前相同的错误。@LachlanD Hmmm。。只是好奇,
.then()
语句是否返回任何值?删除泛型怎么样?它最初没有return语句,但我放了一个return;更明确地说,这没有帮助。对于泛型,我假设您指的是可观察的,如果是这种情况,我可以将其键入任意以使其工作,或者未知也可以工作,但您不能在没有泛型参数的情况下仅使用可观察的。它不工作:(,它还警告空函数已被弃用。返回()如何在mergemap?那也不起作用,我也试过了()为了强制执行类型,它仍然不起作用。试试这个stackblitz,它似乎起作用了。但是我不得不说stackblitz可能没有最新的typescript版本Interesting,我降级到typescript的2.9.2版本,错误现在只是说不能将Observable分配给Observable的类型你刚刚救了我的命!