无法将Rxjs类型Observable <Unknown>分配给Observable <void>

时间:2019-12-27 04:16:17

标签: angular typescript rxjs

我正在从5升级到rxjs v6的过程中,我也将打字稿版本从2.9.2升级到了3.7.4。在我的angularjs组件之一中,我调用了一个返回诺言的服务。为了易于使用,我通过使用rxjs函数将其转换为组件中的可观察对象。我的代码如下所示(名称与原始名称有所不同)。

saveObject(name: string): Observable<void> {
    return from(
            this.myService.saveMyObject(name)
                .then(() => {
                    //Show Save success on ui
                    return;
            }),
        )
        .pipe(
            catchError((error) => {
                // error handling logic
                return of(); // this bit was an attempt to fix the problem
            }),
        );
}

我遇到的问题是组件中的saveObject函数返回一个可观察到的void,promise最终解析为void,但是当我尝试返回该可观察到的对象时,我收到一条错误消息,指出不能将observable 分配给observable 。为什么typescript / rxjs推断类型是未知的,除了进行类型断言以获取正确的类型之外,我还能做些什么?

编辑:完全删除管道并不能解决问题,仅from(promise)足以获取错误,不幸的是,即使这样做告诉rxjs这是对void的承诺也无济于事,它仍然提供了同样的错误。

from<Promise<void>>(//promiseCode)

3 个答案:

答案 0 :(得分:0)

尝试返回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
    }),
);

答案 1 :(得分:0)

这是因为catchError()运算符要求您返回一个可观察值。如文档所述,catchError()

EMAIL_HOST = 'thehost'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'thehostusername'
EMAIL_HOST_PASSWORD = 'thepassword'
EMAIL_USE_TLS = False
EMAIL_USE_SSL = True

并且您需要返回一个可观察值。

Gracefully handle errors in an observable sequence.

如果您不想返回一个可观察对象,那么使用catchError运算符的另一种方法是在订阅该可观察对象时处理错误回调上的错误。

:warning: Remember to return an observable from the catchError function!

答案 2 :(得分:0)

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


    "lib": ["es2015"],