【问题标题】:Rxjs type Observable<Unknown> is not assignable to Observable<void>Rxjs 类型 Observable<Unknown> 不可分配给 Observable<void>
【发布时间】:2020-04-17 03:19:45
【问题描述】:

我正在从 5 升级到 rxjs v6,我也将我的 typescript 版本从 2.9.2 升级到 3.7.4。在我的一个 angularjs 组件中,我调用了一个返回承诺的服务。为了便于使用,我使用 from rxjs 函数将其转换为组件中的 observable。我的代码看起来像这样(名称与原件不同)。

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 的可观察对象,承诺最终解决为 void 但是当我尝试返回可观察对象时,我收到一条错误消息,指出 observable 不可分配给可观察的。为什么 typescript/rxjs 会推断类型未知,除了进行类型断言以获得正确的类型之外,我还能做些什么。

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

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

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    尝试返回 of() 以完成 observable 并查看它是否有效。

    from(this.myService.saveMyObject(name))
    .pipe(
        mergeMap(()=>of()),
        catchError((error) => {
            // error handling logic
            return of(); // this bit was an attempt to fix the problem
        }),
    );
    

    【讨论】:

    • 它不起作用:(,它还警告说空函数已被弃用。
    • 在mergemap中返回of()怎么样?
    • 那也行不通,我也试过 () 来强制类型,但它仍然行不通。
    • stackblitz.com/edit/typescript-dh1nrr 试试这个 stackblitz,它似乎有效。但我不得不说 stackblitz 可能没有最新的打字稿版本
    • 有趣,我降级回 2.9.2 版本的 typescript,现在的错误只是说 can't assign Observable to type of Observable
    【解决方案2】:

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

    Gracefully handle errors in an observable sequence.
    

    你需要返回一个 observable。

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

    如果您不想返回 observable,则使用 catchError 运算符的替代方法是在订阅 observable 时处理错误回调中的错误。

    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
    });
    

    【讨论】:

    • 我正在使用 of() 在 catchError() 中返回一个 observable,我试图执行 of() 但这并没有解决问题。在进行另一次检查后,它似乎根本不在管道中,完全移除管道并不能解决问题。
    • @LachlanD 对不起,你是什么意思..?您是说错误没有在catchError 中传播?
    • 抱歉澄清一下,我完全移除了管道,所以我只有 ``` return from(myPromise) ``` 我仍然收到与以前相同的错误。
    • @LachlanD 嗯.. 只是好奇,.then() 语句是否返回任何值?删除 泛型怎么样?
    • 它最初没有return语句,但我放了return;更明确地说,它没有帮助。对于泛型,我假设您的意思是 Observable,如果是这种情况,我可以将其键入为 any 以使其工作,或者 unknown 也可以工作,但你不能只有 Observable 没有泛型参数。跨度>
    【解决方案3】:

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

    
        "lib": ["es2015"],
    
    

    【讨论】:

    • 你刚刚救了我的命!
    猜你喜欢
    • 2020-11-12
    • 2020-07-28
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2020-01-10
    • 2020-01-10
    • 2021-09-23
    相关资源
    最近更新 更多