我有下面显示的代码。当我尝试设置从服务返回的数据(assetGroup变量)时,所设置的值为null。我最好的选择是因为不是所有嵌套数组都被键入,并且需要被映射。所以我的问题有两个,这是为什么在设置对象后对象继续为null的原因吗?如果是的话,您能以某种方式进行深度映射的分配还是什么是最佳方法?
export class Asset {
constructor(obj: any) {
Object.assign({}, obj);
}
assetId:number;
assetSubGroupId:number;
code: number;
name: string;
}
export class AssetGroup {
constructor(obj: any) {
Object.assign(this, obj);
}
assetGroupId:number;
code: number;
name: string;
assetSubGroupList:Asset[];
}
export class AssetSubGroup {
constructor(obj: any) {
Object.assign(this, obj);
}
assetSubGroupId:number;
assetGroupId:number;
code: number;
name: string;
assetList: Asset[];
}
这是我的服务
getAssetGroup(id:number):Observable<AssetGroup>{
var url = `http://xxx.azurewebsites.net/api/assetgroups/${id}`;
return this.httpClient.get<AssetGroup>(url).pipe(map(x => new AssetGroup(x)));
}
我的组件
private assetGroup: AssetGroup;
loadAssets(id)
{
this.apiService.getAssetGroup(id).subscribe((data) => {
this.assetGroup = data;
console.log(this.assetGroup); // <---- assetGroup is NULL?
});
}
答案 0 :(得分:1)
是的,您需要将响应显式映射到您的班级。 Typescript中的泛型仅能确保您不尝试访问不存在的任何属性,但是HttpClient不会为您创建类的实例。 有关更多信息,请查看github上的讨论:https://github.com/angular/angular/issues/20770
为了使您能够使用它,您有两个选择:
您将需要编写如下内容:
export class AssetGroup {
constructor(obj: any) {
assetGroupId = obj.assetGroupId
code = obj.code;
name = obj.name;
assetSubGroupList = any.assetSubGroupList.map(
asset => new Asset(asset)
);
}
assetGroupId:number;
code: number;
name: string;
assetSubGroupList:Asset[];
}
您的代码不起作用,因为Object.assign在将Asset
的对象与Asset
类型的对象合并时不返回对象类型any
,因此不知道什么输出类型可以描述为。