Angular 4.3中的新HttpClient类似乎默认返回对象而不是任何。
有没有特别的理由这样做,因为打字稿文件说:
不要使用Number,String,Boolean或Object类型。这些 types指的是几乎从不使用的非原始盒装对象 适当地使用JavaScript代码。
https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html
我知道我可以使用以下方式提供自己的返回类型:
this.httpService.get<any>('/api1').subscribe(Data => {console.log(Data.Value1)});
将其设为默认值似乎更容易。我知道我可以为其返回的数据创建特定类型,但使用任何类似的类型会使其更加灵活。
我打算扩展HttpClient并覆盖返回任何方法的方法,但在我这样做之前,我想看看是否有遗漏的东西。
答案 0 :(得分:4)
非原始盒装对象中的关键字几乎从未在JavaScript代码中正确使用 几乎 。
正如this answer中所述,JSON文档可以是undefined
和符号之外的任何内容,这使得Object
类型比any
更合适。
在the manual中解释了any
与Object
的行为:
任何类型都是使用现有JavaScript的强大方式,允许您在编译期间逐步选择加入和退出类型检查。您可能希望Object扮演类似的角色,就像在其他语言中一样。但是Object类型的变量只允许你为它们分配任何值 - 你不能在它们上调用任意方法,即使是那些实际存在的方法
any
响应类型允许在其上调用任意方法,这不是理想的行为,包括那些不存在的行为。
适合JSON响应的类型是
any[] | object | boolean | number | string | null
一个精确的(如here所示,加上null
)是:
type JSONValue = boolean | number | string | null | JSONObject | JSONArray;
interface JSONObject {
[x: string]: JSONValue;
}
interface JSONArray extends Array<JSONValue> { }
这很可能是在HttpClient中应该完成的。虽然Object
不太准确,但仍然比any
更适用。
答案 1 :(得分:3)
免责声明:各种各样的返回类型都有很多重载 - 所以我可能会阅读更多内容而不是我应该阅读。
我还没有看到任何特定的内容支持这一点,但我的猜测是因为Object
更准确地描述了类型,因为它比any
和“本地”更严格地与通用javascript对象方法相关联(见https://blog.mariusschulz.com/2017/02/24/typescript-2-2-the-object-type)。至少在我的谦虚估计中,这似乎符合默认情况下返回响应体(假设为JSON)的变化。
查看此问题的方式更深入地比较对象与任何:TypeScript any vs Object
Alligator.io还有一篇关于HttpClient的文章:https://alligator.io/angular/httpclient-intro/
TLDR:
...一个主要区别是默认情况下需要JSON响应,因此不再需要显式解析JSON响应。
[为简洁而删除之间的文字]
默认情况下,HttpClient返回响应的主体。
[删除更多文字]
如果您希望使用除JSON之外的其他内容作为响应,则可以使用带有responseType键的对象指定预期的响应类型...
我真的建议阅读整篇文章。