#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. Спасибо! Вы сэкономили мне несколько часов!