在我的小项目中,部分功能是管理项目实体。我创建了一个看起来像这样的类:
export class IdRef {
id: number;
}
export class Project {
id?: number;
title: string;
background?: string;
problemStatement?: string;
owner: IdRef;
createdBy: IdRef;
dateCreated: string;
updatedBy?: IdRef;
lastUpdated?: string;
getDateCreated(): Moment {
return moment(this.dateCreated);
}
getLastUpdated(): Moment {
if (this.lastUpdated) {
return moment(this.lastUpdated);
}
return undefined;
}
}
这个想法是当我从API调用中获取项目列表时获得这些对象的列表。
获取列表的服务函数是:
public getProjects(): Observable<Project[]> {
const projectListUrl = `/v1/api/project`;
return this.http.get<Project[]>(environment.apiDomain + projectListUrl)
.pipe(
catchError(this.networkService.handleError)
);
}
我正在这样使用它(在控制器中):
loadProjects() {
this.projectService.getProjects()
.subscribe(
(projects: Project[]) => {
console.log(`fetched ${projects.length} projects`);
this.projects = projects as Project[];
},
error => this.error = error
);
}
我对这一切的期望是,我实际上将获得一个Project对象的列表。但是,控制器中this.projects
的值是一个json对象数组,因此,如果不显式构建对象,则无法使用Project的任何功能。
有没有一种方法可以将json“投射” /解析为对象以获得真实的对象? 怎么样?
答案 0 :(得分:0)
如评论中所述,http.get中的类型转换仅涉及返回对象的形状(即属性),而不涉及方法。
将这些仅属性对象之一转换为所需对象的实际实例以使用Object.assign的最简单方法,如Object.assign(new MyObject(), jsonObject)
例如,
return this.http.get<Project[]>(environment.apiDomain + projectListUrl)
.pipe(
map(jsonObj => Object.assign(new Project(), jsonObj),
catchError(this.networkService.handleError)
);