angular - 将 HttpClient 的响应映射为对象数组
使用 Angular 7 我有这个:
export class Envelope<T> {
result: T[];
constructor(result: T[]) {
this.result = result;
}
}
我将 todoService 返回的 Observable<Envelope<Todo>> 映射为 Observable<TodoModel[]>:
let models: Observable<TodoModel[]> = this.todoService.get()
.pipe(
map((envelope: Envelope<Todo>) =>
envelope.result.map((todo: Todo) => {
return {
content: todo.content
// Other properties
};
})));
这可以工作,但现在 Envelope 改成了 (result: T 而不是 result: T[]):
export class Envelope<T> {
result: T;
constructor(result: T) {
this.result = result;
}
}
我需要将 Observable<Envelope<Todo[]>> 映射到相同的 Observable<TodoModel[]>:
let models: Observable<TodoModel[]> = this.todoService.get()
.pipe(
map((envelope: Envelope<Todo[]>) =>
envelope.result.map((todo: Todo) => {
return {
content: todo.content
// Other properties
};
})));
我尝试了几种选项,但出现了以下错误:
Argument of type 'OperatorFunction<Envelope<Todo[]>, { content: string; }[]>'
is not assignable to parameter of type 'OperatorFunction<Envelope<Todo>, { content: string; }[]>'.
Type 'Envelope<Todo[]>' is not assignable to type 'Envelope<Todo>'.
Type 'Todo[]' is missing the following properties from type 'Response': content.
有人能告诉我如何进行映射吗?
更新
例如,API 返回如下内容:
{
"result": [
{ "id": 1, "title": "T1", content: "C1" },
{ "id": 2, "title": "T2", content: "C2" }
]
}
然后 TodoService 将其作为 Observable<Envelope<Todo[]>> 返回,其中 Todo 是:
interface Todo {
id: number;
title: string;
content: string;
}
在组件中,我需要将 Observable<Envelope<Todo[]>> 映射为 Observable<TodoModel[]>,其中 TodoModel 是:
interface TodoModel {
title: string;
content: string;
}
我的应用程序中有更复杂的场景,但基础是这个。
答案#1
你需要查看信封吗?也许像这样的做法会更直接。如果信封里包含待办事项清单
result: Observable<TodoModel>;
this.todoService.get()
.subscribe((envelope: any) => {
this.result = envelope.todo.content;
});
