Как я должен указывать типы данных в функции map?

#arrays #angular #typescript #rxjs #observable

#массивы #угловой #typescript #rxjs #наблюдаемый

Вопрос:

Я получаю данные с сервера, который представляет собой объект, содержащий четыре массива различных типов объектов. Теперь я пытаюсь сопоставить данные перед подпиской на observable, чтобы я мог использовать правильные классы в своем интерфейсе:

 getData(){
    return this.http.get(this.authUrl   'get/auf-data').pipe(
      map(({material, mat_auf, lokals, auf_analysen}) => {
        material.map(material => this.materialAdapter.adapt(material));
        mat_auf.map(auf => this.materialAufAdapter.adapt(auf));
        lokals.map(lokal => this.lokalAdapter.adapt(lokal));
        auf_analysen.map(analyse => this.aufAnalyseAdapter.adapt(analyse));
      })
    );
  }
  

Ответ имеет тип object, содержащий четыре разных массива, но почему-то я получаю сообщение об ошибке:

Свойство ‘material’ не существует для типа ‘Object’ (повторяется для: mat_auf, lokals и auf_analysen)

Как мне указать типы данных в функции map?

Комментарии:

1. Вам нужно предоставить больше данных. На данный момент вопрос неясен, если не знать структуру данных, поступающих с сервера, и в какую форму вы пытаетесь преобразовать.

2. @MichaelD Адаптеры работают. Единственная проблема заключается в указании параметра функции map. Я ожидаю объект с четырьмя массивами. Как мне указать, что параметры material , mat_auf , lokals и auf_analysen являются массивами такими, что я могу отображать их и изменять объекты в массивах?

3. Я имею в виду, где-то я должен указать, какие данные я ожидаю использовать для работы с ними при использовании RXJS map или нет? Если мое предположение верно, где я должен указать ответ, чтобы отобразить этот ответ в функции канала? Например, как я могу сообщить оператору map, что я ожидаю четыре массива в объекте?

Ответ №1:

Способ определения времени отклика заключается в следующем

   getData() {
    return this.http.get<{ material: any, mat_auf: any, lokals: any, auf_analysen: any; }>('get/auf-data').pipe(
      map(({ material, mat_auf, lokals, auf_analysen }) => {
        material.map(material => this.materialAdapter.adapt(material));
        mat_auf.map(auf => this.materialAufAdapter.adapt(auf));
        lokals.map(lokalisation => this.lokalAdapter.adapt(lokal));
        auf_analysen.map(analyse => this.aufAnalyseAdapter.adapt(analyse));
      })
    );
  }
  

Если вы заглянете внутрь определений типов httpClient , вы увидите, что одно из определений метода get

  get<T>(url: string, options: {
        headers?: HttpHeaders | {
            [header: string]: string | string[];
        };
        observe: 'events';
        params?: HttpParams | {
            [param: string]: string | string[];
        };
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<T>>;
  

И, конечно, вместо any того, чтобы использовать все, что вам нужно, когда вы определяете тело своего ответа.

Комментарии:

1. Спасибо! Вы сэкономили мне несколько часов!