【问题标题】:RxJs Observable<string> vs Observable<string[]>RxJs Observable<string> vs Observable<string[]>
【发布时间】:2017-06-05 10:25:52
【问题描述】:

我很难理解 RxJS Observables,尽管我一生中在许多不同的情况下都使用过 observable 模式。这是一些代码:

    const observable: Observable<Response> = createdElswhere();
    let test1: Observable<string>;
    let test2: Observable<string[]>;

    test1 = observable.map(r => r.json());
    test2 = observable.map(r => r.json());

Response.json() 返回一个数据数组——通常是映射到打字稿对象的对象,但在这种情况下它们只是字符串:

[  
    "test1",
    "test2",
    "test3",
    "test4"
]

当我订阅test1test2 属性时(例如在角度视图模板中,或在代码中手动使用.subscribe()),可观察的泛型类型似乎对框架没有任何影响.即使 observable 中的“数据”不同(一个是数组,另一个是 observable 字符串数组),项目的显示完全相同。

谁能解释Observable&lt;string&gt;Observable&lt;string[]&gt; 之间的区别,并举例说明应该如何使用它们

【问题讨论】:

  • 如果事件给你一个字符串,你应该使用 ,如果事件返​​回一个字符串数组,你应该使用 。在这种情况下,您的 observable 似乎正在返回一个字符串数组。重要的是响应包含什么。 :)
  • 这就是我的想法。但是,我所有的 observable 都被定义为 Observable(而不是 Observable,但是我的所有数据都是从后端作为数组返回的;我没有收到 TS 警告,并且任何订阅代码都没有似乎不在乎我如何定义它。
  • 您定义的类型仅在编译时,在运行时所有类型信息都会丢失。此外,服务器返回的应该是你的 observable 的类型,你在那里写的类型是用来描述的,他们不强制要求它。我认为这里的问题是您只是输入了错误的 observables。
  • 我本以为运行时会接受它 - 我的 json 数组无法转换为 Observable
  • 没有使用 typescript 进行运行时类型检查,如果这是您要查找的内容,则说明您使用了错误的语言。

标签: angular typescript rxjs observable


【解决方案1】:

Observable&lt;string&gt; 表示您正在为字符串类型创建观察者

Observable&lt;string[]&gt; 表示您正在为字符串数组创建观察者

因为你是在打字稿中编码,所以它只是一个类型检查,当你错误地尝试分配变量时,它可以帮助你的编译器。因为类型脚本被编译为没有类型检查的 javascript,所以不管你用什么赋值

例如: **在打字稿中**

let k:int;

k=r.json().val;

在javascript编译代码中等于

var k;

k=r.json().val;

所以如果r.json().val return int 那么 k 会变成 int 并且 k 是 string 它会变成 string

【讨论】:

    【解决方案2】:

    Observable&lt;string&gt; 是可观察对象的类型,其中每个发出的值都应该是一个字符串。 Observable&lt;string[]&gt; 是可观察对象的类型,其中每个发出的值都应该是字符串数组。

    你分配给可观察对象的任何类型都不会改变可观察对象实际发出的内容。这仅取决于 observable 的构造方式。如果你做observable.map(r =&gt; r.json())r.json 返回一个字符串,结果 observable 将发出字符串,如果它返回一个字符串数组,结果 observable 将发出字符串数组。

    表示,如果r.json 有类似(r: Response): string[] 的类型签名,Typescript 应该会抱怨test1 的类型不兼容。

    【讨论】:

      【解决方案3】:

      正如其他人解释的那样,类型参数(您放在&lt; &gt; 之间的那个)向打字稿指示此可观察对象发出的数据的类型。

      如上所述,在运行时,这没有区别,因为 typescript 在构建时运行类型检查。

      话虽如此,test1test2 之间没有区别,因为 .json() 返回 any (refer here),因此如果您将其转换为 stringstring[]。 另一方面,如果您尝试对您输入为string[] 的内容使用字符串方法(例如replace),则会投诉。

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 2019-03-05
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        相关资源
        最近更新 更多