2017-06-05 95 views
1

虽然我在整个人生中使用了许多不同情况下的可观察模式,但我很难在RxJS Observables里找到自己的头。下面是一些代码:RxJs Observable <string> vs Observable <string[]>

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内部的'data'不同(一个是数组,另一个是可观察字符串的数组),项目显示完全相同。

任何人都可以解释Observable<string>Observable<string[]>之间的区别,并举例说明他们应如何使用

+2

如果事件返​​回一个字符串数组,则应该使用;如果事件返​​回一个字符串数组,则返回。在这种情况下,您的observable似乎正在返回一个字符串数组。重要的是响应包含的内容。 :) – toskv

+0

这是我的想法。然而,我所有的观测数据被定义为Observable (而不是Observable ,但是我所有的数据都是作为数组从后端返回的;我没有收到TS警告,并且任何订阅代码似乎都不关心我定义它 – Spikeh

+1

你定义的类型只在编译时,运行时所有的类型信息都会丢失,服务器返回的结果应该是你的observable的类型,你写的类型在那里描述,他们没有强制它。我认为这里的问题是,你只是输入你的观察错误 – toskv

回答

1

Observable<string> meansthat您​​正在创建string类型

Observable<string[]> 一个观察者意味着你正在创建的字符串

的阵列中的观察者,因为你是在打字稿编码,它只是一个类型检测,这有助于你的编译器当你错误地尝试分配变量。因为类型的脚本被编译成JavaScript它可是没有类型检查所以无论dosent什么你

例如赋值: **在打字稿**

let k:int;

k=r.json().val;

在javascript编译的代码等于

var k;

k=r.json().val;

所以如果r.json().val返回整数,那么k将成为i​​nt和k为弦,它就会成为串

0

Observable<string>是其中每个发射值被认为是一个字符串可观测量的类型。 Observable<string[]>是其中每个发射值应该是一个字符串数组的可观察类型。

无论您指定给observable的类型如何,都不会改变observable实际发出的内容。这仅取决于观察结构的构建方式。如果你做observable.map(r => r.json())r.json返回一个字符串,那么得到的observable将发出字符串,如果它返回一个字符串数组,那么得到的observable将会发出字符串数组。

说,如果r.json具有像(r: Response): string[]一个类型签名,打字原稿应该抱怨test1的类型不兼容。

相关问题