我很难绕过RxJS Observables,虽然我已经在我生命中的许多不同情况下使用了可观察的模式。这是一些代码:
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()返回一个数据数组 - 通常是将映射到typescript对象的对象,但在这种情况下它们只是字符串:
[
"test1",
"test2",
"test3",
"test4"
]
当我订阅test1
或test2
属性时(在角度视图模板中,或者使用.subscribe()
代码手动编写代码),可观察的泛型类型不会似乎对框架有任何影响。这些项目显示完全相同,即使数据&#39;在observable内部是不同的(一个是数组,另一个是可观察字符串数组)。
任何人都可以解释Observable<string>
和Observable<string[]>
之间的区别,并举例说明应该如何
答案 0 :(得分:1)
Observable<string>
意味着你要为类型字符串
Observable<string[]>
表示您正在为字符串数组
因为你在打字稿中编码它只是一个类型检查,当你错误地尝试分配变量时它会帮助你的编译器。因为类型脚本被编译为javascript,它没有类型检查所以它与你用
分配值有关例如: **在打字稿**
let k:int;
k=r.json().val;
在javascript编译的代码中等于
var k;
k=r.json().val;
所以如果r.json().val
返回int,则k将变为int,k为字符串,它将变为字符串
答案 1 :(得分:0)
Observable<string>
是可观察的类型,其中每个发射的值应该是一个字符串。
Observable<string[]>
是observable的类型,其中每个发出的值应该是一个字符串数组。
分配给observable的任何类型都不会改变observable实际发出的内容。这仅取决于观察结构的构建方式。如果你observable.map(r => r.json())
和r.json
返回一个字符串,结果observable将发出字符串,如果它返回一个字符串数组,结果observable将发出字符串数组。
说,如果r.json
的类型签名如(r: Response): string[]
,那么Typescript应该抱怨test1
的类型不兼容。
答案 2 :(得分:0)
正如其他人所解释的,type参数(放在< >
之间的类型参数)指示打字稿此可观察对象发出的数据的类型。
同样,在运行时,这没有什么区别,因为typescript在构建时运行类型检查。
话虽这么说,test1
和test2
之间没有区别,因为.json()
返回any
(refer here),所以打字稿不能抱怨如果将其投射到string
或string[]
。
另一方面,如果您尝试对键入为replace
的内容使用字符串方法(例如string[]
),则会抱怨。