为什么httpclient在angular 4.3中返回Object而不是任何?

时间:2017-07-16 22:51:25

标签: angular typescript

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并覆盖返回任何方法的方法,但在我这样做之前,我想看看是否有遗漏的东西。

2 个答案:

答案 0 :(得分:4)

非原始盒装对象中的关键字几乎从未在JavaScript代码中正确使用 几乎

正如this answer中所述,JSON文档可以是undefined和符号之外的任何内容,这使得Object类型比any更合适。

the manual中解释了anyObject的行为:

  

任何类型都是使用现有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键的对象指定预期的响应类型...

我真的建议阅读整篇文章。