Ответ от HttpClient на массив объектов - PullRequest
0 голосов
/ 13 мая 2019

Используя Angular 7 у меня было это:

export class Envelope<T> {
  result: T[];

  constructor(result: T[]) {
    this.result = result;
  }
}

Я сопоставил Observable<Envelope<Todo>>, возврат через todoService, к 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
        };
      })));

Это работает, но теперь конверт изменен на (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 Ответ

0 голосов
/ 13 мая 2019

Вам нужно соблюдать конверт?Может быть, что-то вроде этого будет более прямым.Если конверт содержит список задач

result: Observable<TodoModel>; 

    this.todoService.get()
          .subscribe((envelope: any) => {
            this.result = envelope.todo.content;       
          });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...