我如何区分可能返回错误的RxJs可观测对象和可能不在TypeScript中的RxJs可观测对象?

我如何区分可能返回错误的RxJs可观测对象和可能不在TypeScript中的RxJs可观测对象?,typescript,rxjs,observable,Typescript,Rxjs,Observable,在我的应用程序中有两种“类型”的可观察的s: Observables只返回数据,从不返回错误,因此我可以安全地.subscribe()订阅Observable,而无需传递错误回调 可观察的s可能返回数据或可能返回错误,因此在订阅可观察的时,我应该提供下一个和错误回调 Observable.throw()返回一个ErrorObservable。因此,返回类型2的可观察的函数返回类型可观察| ErrorObservable。如果我想.subscribe()到那个可观察的,TypeScript奇怪地期

在我的应用程序中有两种“类型”的
可观察的
s:

  • Observable
    s只返回数据,从不返回
    错误
    ,因此我可以安全地
    .subscribe()
    订阅
    Observable
    ,而无需传递
    错误
    回调
  • 可观察的
    s可能返回数据或可能返回
    错误
    ,因此在订阅可观察的时,我应该提供
    下一个
    错误
    回调
  • Observable.throw()
    返回一个
    ErrorObservable
    。因此,返回类型2的
    可观察
    的函数返回类型
    可观察| ErrorObservable
    。如果我想
    .subscribe()
    到那个
    可观察的
    ,TypeScript奇怪地期望0个参数,所以没有
    next
    error
    回调,这对我来说似乎是错误的。因此,我认为我必须将类型2
    Observable
    s表示为
    Observable
    。但是,作为一个想要订阅
    可观察的
    的人,我永远不知道
    可观察的
    是否会返回一个
    错误


    那么,我如何才能正确区分这两种情况呢?我在这里遗漏了什么吗?

    似乎您无法使用代码来完成这项工作。您可以肯定地知道,某个可观察对象可能永远不会抛出(例如:
    observatable.from(1)
    只发出一个并完成;没有错误的位置)并忽略
    onError
    回调。对于其他人,建议提供
    onError
    回调以正常退出


    正如您所提到的,您不能使用type
    Observable | ErrorObservable
    订阅,因为
    ErrorObservable
    的界面不包含
    subscribe
    方法。正如你所看到的,这是一个错误。您使用了类型交叉,这意味着生成的类型只包含上存在的属性和方法,而
    可观察的
    错误可观察的
    不包含名为
    订阅的方法,因此生成的类型也不包含它。您可能希望使用类型联合,例如,
    Observable&ErrorObservable
    ,这样生成的类型包含至少一个包含的类型中存在的方法,因此您可以订阅它。阅读更多有关类型交点和并集的信息

    我真的不相信这种区别是有意义的。通过设计,可观察对象总是可能发出错误

    请注意,如果在可观察代码中的任何位置抛出异常,也会导致发出错误,因此,即使您认为可观察代码无法发出错误,内存或堆栈空间不足或代码中遇到错误的可能性也很小,这将发出错误

    因此,在我看来,您应该像对待JavaScript中的异常一样对待可观察到的错误——无论它们发生在哪里,都需要处理它们。(顺便提一下,Java区分了RuntimeException(本质上是计划外的异常)和需要声明和捕获的异常,这是您要寻找的区别,但JavaScript没有这样做。)


    简而言之:我只需要在每个可观察对象上添加一个错误处理程序。

    一般来说,每个可观察对象都可以发送
    next
    error
    通知。您不能有一个无法发送
    错误
    通知的可观察对象

    打字不能告诉你一个可观察的物体是否会发出错误,因为它总是会发出错误。因此,键入仅对
    next
    值有帮助

    请注意,可观察对象本身可能不会发出错误,但错误可能来自一系列运算符。例如,如果您有
    Observable.from([1,2,3,4])
    ,它通常不会发出任何错误,您可以将其与以下内容链接:

    const s = new Subject<number>();
    
    const source = Observable.from([1, 2, 3, 4])
      .merge(s)
      .map((v: number) => {
        if (v === 'a') {
          throw new Error();
        }
        return v;
      })
    
    s.next('a' as any);
    
    const s=新主题();
    常量源=可观察的。从([1,2,3,4])
    .合并
    .map((v:编号)=>{
    如果(v=='a'){
    抛出新错误();
    }
    返回v;
    })
    s、 下一步(“a”如有);
    

    你会考虑<代码>源>代码>作为一个可观察到的可能会发出错误的信息吗?


    打字不允许你使用数字以外的任何东西。但是您可以(例如)错误地传递一个字符串。

    如果我使用union类型,我不能直接在
    可观察的
    上订阅()
    ,因为它也可能是一个
    可观察的错误
    ,对吗?理想情况下,我希望
    Observable
    指示它是否返回
    错误,例如
    Observable
    之类的内容。这个案例的“最佳实践”是什么?这并不完全正确。事实上,你并不真的需要这样一个类型的联合。当一个普通的可观察对象抛出错误时,它不会“转换”为一个
    ErrorObservable
    ,而是发出一个
    error
    通知供观察者使用。我们确实使用了
    Observable.throw
    在可观察链中以编程方式抛出错误,因此发出
    error
    通知
    Observable
    就像
    Observable.from(1)
    永远不会返回
    错误。对我来说,在那里添加
    错误
    回调是没有意义的。。。另外,在我的Angular应用程序中,有一个全局错误处理程序,它捕获所有未处理的
    错误。因此,如果我忘记传递
    错误
    回调,全局处理程序将接收它。因此,我并不担心遗漏一个
    错误
    ,但它实际上只是关于代码中的区别。