Typescript严格类型检查不能在observable中使用字符串和数组

时间:2018-04-04 10:58:53

标签: javascript typescript observable

我正在尝试使用Typescript严格类型检查并设置返回类型的函数是一个“字符串”但是在成功时我返回“resp.josn()”并且它的工作甚至TS都有严格类型检查。

与返回user []等数组相同的问题,但是只是传递对象的响应,而且正在运行

请帮助为什么允许这样做。

  public getInfo(): Observable<string> {
    const url = 'http://it-ebooks-apisss.info/v1/search/php%20mysql/page/3';
    var options = new RequestOptions({
       headers: new Headers({
       'Accept': 'application/text',
       })
    });
    return this.http.get(url, options).map((resp: Response) => (resp.json()))
}

1 个答案:

答案 0 :(得分:1)

类型检查按预期工作。

如果您查看Angular的Response课程,您会发现Response.json()被定义为() => any,这意味着json方法可以返回随便哪种。这是合乎逻辑的,因为你永远不知道在解析JSON时你可以得到什么样的对象。

因此,您的return语句正在执行以下类型操作:

Observable<Response> -> (map) -> Observable<any>

不幸的是,通过在TypeScript中使用any,您基本上禁用了类型检查。在TypeScript中,any可以转换为任何内容。使用any时,您会告诉TypeScript注意自己的商务,因为您知道自己在做什么。

因此,Observable<any>可以分配给Observable<string>类型的变量,反之亦然。

但是,如果您想要返回文字,也许您不应该使用json(),而是text()text()() => Observable<string>,也许就是你想要的。

或者您可以告诉map您返回的对象类型。如果您知道json()返回符合MyObject inteface的对象,那么您可以写:

return this.http.get(url, options).map((resp: Response) => <MyObject>(resp.json()));

现在类型转换是:

Observable<Response> => (map) => Observable<MyObject>

TypeScript会抗议,因为你的函数应该返回Observable<string>