为什么Angular 4.3中的httpclient返回Object而不是any?
为什么Angular 4.3中的httpclient返回Object而不是any?
Angular 4.3中的新HttpClient类似乎默认返回Object而不是any。这样做是否有特定的原因,鉴于typescript文档中说:
永远不要使用Number、String、Boolean或Object类型。这些类型指的是非原始封装对象,在JavaScript代码中几乎从不被正确使用。
https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html
我知道我可以使用以下方式提供自己的返回类型:
this.httpService.get
但将其设置为默认值会更方便。我知道我可以创建一个特定于返回数据的类型,但是使用any似乎会使其更灵活。
我打算扩展HttpClient并覆盖方法以返回any,但在此之前,我想看看是否有我忽略的东西。
在Angular 4.3中,为什么httpclient返回Object而不是any?
免责声明:有很多可用的重载和各种返回类型,所以我可能读进去比我应该读的更多。
我没有看到任何具体的东西来支持这一点,但我猜是因为Object更准确地描述了类型,因为它比any更严格,并且“本地”地与通用javascript对象方法相关联(参见https://blog.mariusschulz.com/2017/02/24/typescript-2-2-the-object-type)。至少在我谦卑的评估中,这似乎符合默认返回响应体(假定为JSON)的更改。
关于Object vs any的更详细比较,请参见此问题:TypeScript any vs Object
还有一篇关于HttpClient的很棒的文章,由Alligator.io提供:https://alligator.io/angular/httpclient-intro/
简而言之:
...一个主要的区别是默认情况下期望一个JSON响应,所以不再需要显式地解析JSON响应。
[为了简洁起见,已删除部分文本]
默认情况下,HttpClient返回响应的body。
[删除更多文本]
如果您期望除JSON以外的其他响应,可以使用一个带有responseType键的对象来指定预期的响应类型...
我真的建议阅读整篇文章。
为什么Angular 4.3中的httpclient返回的是Object而不是any?
在JavaScript代码中,几乎从不适当使用的非原始封装对象这个词中的关键字是几乎。
正如这个答案中所解释的,JSON文档可以是任何类型,但不能是undefined
和符号,这使得Object
比any
更适合作为类型。
在手册中解释了any
与Object
的行为:
any类型是与现有JavaScript一起工作的强大方式,允许您在编译期间逐渐选择是否进行类型检查。你可能期望Object在TypeScript中扮演类似的角色,就像在其他语言中一样。但是,类型为Object的变量只允许你给它们赋任何值 - 你不能在它们上调用任意方法,即使这些方法实际存在。
any
响应类型允许在其上调用任意方法,这是不可取的行为,包括那些不存在的方法。
适合JSON响应的类型是
any[] | object | boolean | number | string | null
而且精确的类型(类似于这里所示,增加了null
)是:
type JSONValue = boolean | number | string | null | JSONObject | JSONArray; interface JSONObject { [x: string]: JSONValue; } interface JSONArray extends Array<JSONValue> { }
这可能是在HttpClient中应该采用的方式。虽然Object
比any
更不准确,但仍然更适用。