网站搜索

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;       
          });