Angular can';由于httpClient响应数据数组抛出类型脚本生成问题,无法生成角度应用程序
您好,我已经退出编码游戏几年了,我正在Angular 8上升级(不喜欢!)我可以运行ng serve,一切都很好,但如果我尝试构建,我在这里遇到了一个错误Angular can';由于httpClient响应数据数组抛出类型脚本生成问题,无法生成角度应用程序,angular,typescript,httpclient,build-error,Angular,Typescript,Httpclient,Build Error,您好,我已经退出编码游戏几年了,我正在Angular 8上升级(不喜欢!)我可以运行ng serve,一切都很好,但如果我尝试构建,我在这里遇到了一个错误 userD(){ //TODO用户服务将在稍后进行。 var aToken=localStorage.getItem('token'); const headers=new HttpHeaders().set(“授权”、“承载人”+aToken); this.httpClient.get('http://127.0.0.1:8000/api/
userD(){
//TODO用户服务将在稍后进行。
var aToken=localStorage.getItem('token');
const headers=new HttpHeaders().set(“授权”、“承载人”+aToken);
this.httpClient.get('http://127.0.0.1:8000/api/auth/user“,{headers})
.订阅((res:any[])=>{
//@ts忽略
this.users=res.data.result;//它不喜欢生成中的.data.result部分
console.log(this.users);
});
}
我现在正在使用//@ts ignore,这并不理想,但我不知道为什么它在进入阵列时会出现问题,如果我使用它作为res,它就可以了
任何信息都有助于我理解这一点。多谢各位
注意:编辑
这里是json
我想提取这个results对象,然后在html中使用它来循环
{“状态”:“200”,“数据”:{“结果”:{“id”:3,“姓名”:“帕特里克·洛德”,“电子邮件”:”patrick@larvel.io“,”电子邮件地址:“:”空“,”电话“:”123456789“,”个人档案“:”71“,”创建地址“:”2019-09-19 19:43:04“,”更新地址“:”2019-09-19:43:04“,”条带id“:”空“,”卡牌“:”空“,”卡牌“:”最后四个“:”空“,”试用结束时间“:”空“,”性别“:”男“,”地址1“:”我不住在这里”,“地址2”:“232”,“城市”:“Clearfield”,“国家”:“USA”,“Zip_Post”:“55550”,“YouTube”}}解释
JB一针见血:你得到了一个TypeScript错误,因为any[]
类型没有data
属性;根据定义,any[]
需要任何东西,唯一的限制是输入必须是Array
类型的对象
但是为什么build--prod
中出现错误而不是service
?
您在ng build--prod
而不是ng serve
上遇到错误是因为默认的Angular环境在--prod
上强制执行strict
(如“严格遵守键入和语法”),但在本地开发环境中不强制执行strict
。这样,在本地开发时,在清理代码以供生产使用之前,您就可以更轻松地处理和解决问题,因为在本地开发时,不太可能出现草率的语法问题。我也花了一点时间才意识到这一点,但这是件好事(tm):P
理由
JavaScript可以让你做任何你想做的事情:它不知道res
将是什么样子,但它假设你知道你在做什么,如果你说res
将有一个名为data
的属性,它就会随之滚动
如果你有一个小项目,或者你是唯一一个要做这个项目的人,这是很好的,但是当项目变得更大,或者如果你有多个开发人员提交代码,这就开始变得很棘手了。你知道res
有一个data
属性,但萨曼莎怎么知道的
输入TypeScript
是JavaScript…带有类型。类型提供给定对象的形状,因此所有相关人员(包括TypeScript transpiler)都知道发生了什么。当你说res:any[]
时,TS听到的是“objectres
将是数组类型的对象
”;但是,我们没有告诉TS关于数组中的成员项的任何信息,而且由于TS不知道数组res
将是什么类型,因此我们只能访问array
类型本身的通用方法和属性
修复
那么,我们需要做什么来代替(res:any[])
来制作this.users=res.data.result代码>工作
为ResponseObject定义一个接口
首先,我们需要告诉TS更多的细节:
导出接口响应对象{
数据:{
结果:{};
}
}
现在TS知道有一个名为ResponseObject
的对象,它(至少)有一个data
属性,而data
属性本身就是一个对象,它(至少)有一个名为result
的属性
告诉TypeScript期待我们的响应对象
我们可以将其插入订阅呼叫,如下所示:
.subscribe((res:ResponseObject)=>{
this.users=res.data.result;//现在它完全像build--prod中的.data.result部分!
console.log(this.users);
});
等一下。。。
您可能会注意到,res
不再是Array
类型的对象;根据您发布的代码以及您说它通过ng serve
工作的事实,听起来您希望有一个ResponseObject,它提供一个UserObjects数组作为数据的有效负载。result
属性;如果是这样,上面的代码示例应该可以正常工作
但是,如果我们的.get()
确实返回了一个responseObject数组,那么我们需要做一些额外的工作
处理一系列响应对象
让我们先修改接口声明:
导出接口响应对象{
状态:number;/*可以排除我们不需要的东西,
但是,状态属性将在以下情况下派上用场:
我们最终希望为案例编写catch语句
当调用返回错误而不是我们需要的数据时
通缉*/
数据:{
/*您还可以将接口声明拆分为
使它们更易于阅读;这还有
允许我们更轻松地访问的子属性
稍后我们的有效载荷*/
结果:UserObject;/*我们需要一个
在这种情况下,每个ResponseObject的UserObject,
否则,我们将使用:*/
//结果:UserObject[];
}
}
expor