Как передать / отобразить наблюдаемый в Angular

Вложенный объект отображается как [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 []> ».


person Tong    schedule 08.01.2019    source источник
comment
Когда ваш тип возврата Observable<Client[]> , почему вы возвращаете Observable<Address> ?   -  person Ashish Ranjan    schedule 08.01.2019
comment
Кроме того, подобное приведение просто обманывает Typescript (и это нормально), но на самом деле оно не выполняет никаких преобразований в возвращаемых данных.   -  person Ashish Ranjan    schedule 08.01.2019
comment
@xyz, теперь это имеет смысл, когда я прочитал это снова. Я слишком долго смотрел на это. Основная цель - сделать client.address адресом, чтобы я мог использовать его для интерполяции. Какие-либо предложения?   -  person Tong    schedule 08.01.2019
comment
Измените тип возвращаемого значения метода: getClients(customerId: number): Observable<Address> {}, также возможно имя метода, если он возвращает только адрес, а не полный клиент.   -  person Ashish Ranjan    schedule 08.01.2019
comment
В противном случае верните полный клиент, getClients (customerId: number): Observable ‹Client› {... return this.http.get ‹Client› (clientUrl)}. Выньте адрес, по которому вы подписываетесь. Получение полной версии клиента кажется лучшим вариантом   -  person Ashish Ranjan    schedule 08.01.2019


Ответы (2)


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>, а не массив.

person Dasha Ermolova    schedule 08.01.2019
comment
Спасибо, это то, что я пытался сделать. - person Tong; 08.01.2019

Проблема здесь:

getClients(customerId: number): Observable<Client[]> {

вы запросили функцию возврата в виде наблюдаемого (массива клиента), но на самом деле вы возвращаете наблюдаемый адрес.

.pipe(map(client: Client) => client.address as Address);

Вот почему функция выдает эту ошибку. Заменить Observable<Client[]> на Observable<Address[]>

person Akshay Rajput    schedule 08.01.2019