为什么Angular 4.3中的httpclient返回Object而不是any?

17 浏览
0 Comments

为什么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('/api1').subscribe(Data => {console.log(Data.Value1)});

但将其设置为默认值会更方便。我知道我可以创建一个特定于返回数据的类型,但是使用any似乎会使其更灵活。

我打算扩展HttpClient并覆盖方法以返回any,但在此之前,我想看看是否有我忽略的东西。

0
0 Comments

在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键的对象来指定预期的响应类型...

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

0
0 Comments

为什么Angular 4.3中的httpclient返回的是Object而不是any?

在JavaScript代码中,几乎从不适当使用的非原始封装对象这个词中的关键字是几乎

正如这个答案中所解释的,JSON文档可以是任何类型,但不能是undefined和符号,这使得Objectany更适合作为类型。

手册中解释了anyObject的行为:

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中应该采用的方式。虽然Objectany更不准确,但仍然更适用。

0