【发布时间】:2019-06-07 08:47:28
【问题描述】:
我无法解析 API 的输出(项目数组在属性 results 内)。因为 TS 说 results 不是 Project 类的属性。
项目类:
export class Project {
project_id: string;
project_name: string;
project_code: string;
project_lead: string;
project_cost_center: number;
project_number: string;
budget: number;
team: string;
provision: boolean;
project_groups: any;
project_networks: any;
applications: any;
project_environments: any;
subscription: string;
created_at: string;
}
API 响应示例:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"url": "http://localhost:8000/api/v1/projects/COA/",
"project_id": 57,
"project_name": "Compliance Application",
"project_code": "COA",
"project_lead": "John Doe",
"project_cost_center": "9005",
"project_number": "900512I320",
"budget": 600.0,
"team": "http://localhost:8000/api/v1/teams/TTA/",
"provision": true,
"project_groups": [],
"project_networks": [
"http://localhost:8000/api/v1/ip-network/23/"
],
"applications": [
"http://localhost:8000/api/v1/applications/COA/"
],
"project_environments": [
"http://localhost:8000/api/v1/environments/8/",
"http://localhost:8000/api/v1/environments/7/"
],
"subscription": "http://localhost:8000/api/v1/subscriptions/128a4bb5-604d-11e9-86ee-88e9fe8080e6/",
"created_at": "2019-04-16T13:37:05.293000Z"
}
]
}
这是我正在使用的:
Angular CLI: 8.0.1
Node: 12.4.0
OS: darwin x64
Angular: 8.0.0
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Package Version
-----------------------------------------------------------
@angular-devkit/architect 0.800.1
@angular-devkit/build-angular 0.800.1
@angular-devkit/build-optimizer 0.800.1
@angular-devkit/build-webpack 0.800.1
@angular-devkit/core 8.0.1
@angular-devkit/schematics 8.0.1
@angular/cli 8.0.1
@ngtools/webpack 8.0.1
@schematics/angular 8.0.1
@schematics/update 0.800.1
rxjs 6.4.0
typescript 3.4.5
webpack 4.30.0
我的初始函数如下所示:
// HttpClient API get() method => Fetch project list
getProjects(): Observable<Project[]> {
return this.http.get<Project[]>(this.apiURL + '/projects')
.pipe(
retry(1),
catchError(this.handleError)
)
}
当然,我应该使用 RxJS 的 map 和来自 GET 操作的数据来迭代 results 并产生对象数组。
如果我这样做
// HttpClient API get() method => Fetch project list
getProjects(): Observable<Project[]> {
return this.http.get<Project[]>(this.apiURL + '/projects')
.pipe(
map(data => data.json().results),
retry(1),
catchError(this.handleError)
)
}
然后我收到一条消息说类Project 没有属性json()。这是因为我将.get() 方法类型转换为Project[]?如果是这样,我应该如何进行类型转换?
我希望能正确地进行类型转换,但我对 Angular 还很陌生,文档没有帮助。
【问题讨论】:
-
HttpClient.get() 自动应用 res.json() 并返回。您不再需要自己调用此函数。
-
即便如此,
data.results也不起作用,因为我相信它会将get()的输出视为Project[]类型。我应该将get()转换成别的东西吗? -
您能展示您的
Project定义吗?是interface还是class? -
.json()在类型HttpResponseangular.io/api/common/http/HttpResponse 上确实不存在。 -
我更新了问题以显示项目类和 API 响应格式。
标签: json angular rest rxjs observable