Вложенный объект отображается как [object Object], поэтому я пытаюсь передать его через конвейер и карту, но я ни к чему не добираюсь. Я пробовал модели как классы и интерфейсы, но безрезультатно. Может кто подскажет, что я делаю не так? Спасибо.
Функция:
getClients(customerId: number): Observable<Client[]> {
let clientUrl = 'SOME_URL';
return this.http.get<Client[]>(clientUrl)
.pipe(map(client: Client) => client.address as Address);
}
Модели:
import { Address } from './address.model';
export class Client{
id: number;
name: string;
accountNumber: string;
addressId: number;
phoneNumber: string;
address: Address;
}
export class Address{
id: number;
name: string;
addressLine1: string;
addressLine2: string;
city: string;
postalCode: string;
}
Я получаю сообщение об ошибке: Ошибка TS2345 (TS) Аргумент типа «Адрес» не может быть назначен параметру типа «OperatorFunction <{}, Client []>».
Кроме того, подобное приведение просто вводит в заблуждение Typescript (и это нормально), но на самом деле оно не выполняет никаких преобразований в возвращаемых данных.
@xyz, что теперь имеет смысл, когда я прочитал это снова. Я слишком долго смотрел на это. Основная цель - сделать client.address адресом, чтобы я мог использовать его для интерполяции. Какие-либо предложения?
Измените тип возвращаемого значения метода: getClients(customerId: number): Observable<Address> {}, также возможно имя метода, если он возвращает только адрес, а не полный клиент.
В противном случае верните полного клиента, getClients (customerId: number): Observable <Client> {... return this.http.get <Client> (clientUrl)}. Выньте адрес, по которому вы подписываетесь. Получение полной версии клиента кажется лучшим вариантом





Проблема здесь:
getClients(customerId: number): Observable<Client[]> {
вы запросили функцию возврата в виде наблюдаемого (массива клиента), но на самом деле вы возвращаете наблюдаемый адрес.
.pipe(map(client: Client) => client.address as Address);
Вот почему функция выдает эту ошибку.
Заменить Observable<Client[]> на Observable<Address[]>
1) удалите часть трубопровода из вашего метода getClients ()
2) выполните карту каналов перед подпиской на getClients () или создайте другой метод, который будет выполнять только часть конвейера с наблюдаемым, возвращаемым из getClients ()
mapToAddress(): Observable<Address[]> {
this.getClients.pipe(
map((clients: Client[]) => clients.map(client => client.address))
)
}
Это важно понимать: когда вы вызываете метод .map () внутри .pipe (), вы не получаете ни одного клиента, в этом случае вы получаете весь массив клиентов, помещенный в Observable. Поскольку вы сопоставляете значения, которые хранятся в Observable - значения типа: <Client []>.
Ваша карта каналов будет работать на некотором Observable, который испускает одного клиента типа <Client>, а не массив.
Спасибо, это было то, что я пытался сделать.
сэр, вы можете сказать мне, как поступить, если client.address) будет нулевым?
Если ваш тип возврата -
Observable<Client[]>, почему вы возвращаетеObservable<Address>?