Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular can';由于httpClient响应数据数组抛出类型脚本生成问题,无法生成角度应用程序_Angular_Typescript_Httpclient_Build Error - Fatal编程技术网

Angular can';由于httpClient响应数据数组抛出类型脚本生成问题,无法生成角度应用程序

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/

您好,我已经退出编码游戏几年了,我正在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/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听到的是“object
res
将是
数组类型的
对象
”;但是,我们没有告诉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