我正在尝试使用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()))
}
答案 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>
。