代码之家  ›  专栏  ›  技术社区  ›  gib65

RxJS可观测发射数;next()接受字符串;Typescript如何处理这个问题?

  •  0
  • gib65  · 技术社区  · 5 年前

      subscribeSubject() {
        const subject = new Subject();
    
        subject.subscribe({
          next: (v1: number) => console.log('v1=',v1)
        });
    
        subject.subscribe({
          next: (v2: number) => console.log('v2=',v2)
        });
    
        const observable = from([1,2,3]);
        observable.subscribe(subject);
      }
    

    在Typescript中,我可以将上述观察者的next方法的参数声明为字符串。但我创造的可观察物会发出数字;我想知道在这种情况下会发生什么,希望Typescript告诉我我不能向接受字符串的观察者发送数字。但事实并非如此。它让我来编译。当我运行它时,我发现观察者打印出了我发出的任何东西(我将数字切换为字符“a”、“b”和“c”),然后它通过了 v1=a v2=a v1=b v2=b v1=c v2=c ).

    然后我想知道为什么Typescript会允许这样做。这就是我的问题所在。上述情况是否为Typescript 不能 确定将向采用字符串的方法发送数字?它怎么知道?是的,我正在创建一个发出数字的可观察对象,但是在那一行,编译器无法告诉我如何使用它。我可能只是把它们发射到不同的物体上,那些确实需要数字的物体。是的,主体确实最终订阅了可观察对象,但在这一点上,我想知道对于Typescript来说,这是否太复杂了(我可以看到它在一些复杂的应用程序中变成了一个很深的rabit洞),所以它就不会了。毕竟,这条线 observable.subscribe(subject) 不必马上就来 const observable = from(['a','b','c']) . 它可以位于应用程序中的任何位置。简言之,这是一个可以解决的问题。

    因此,我的问题是:我是否正确理解了上述内容?这个问题是编译器无法解决的吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   yurzui    5 年前

    如果要限制主题仅使用数字,则可以在声明时指定:

    const subject = new Subject<number>();
                               ^^^^^^^^
    

    在这种情况下,如果要传递字符串,TS将不会编译:

    const observable = from(['a', 'b']);
observable.subscribe(subject);