Как передать / отобразить наблюдаемое в 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 []>».

Если ваш тип возврата - Observable<Client[]> , почему вы возвращаете Observable<Address> ?

Ashish Ranjan 08.01.2019 04:23

Кроме того, подобное приведение просто вводит в заблуждение Typescript (и это нормально), но на самом деле оно не выполняет никаких преобразований в возвращаемых данных.

Ashish Ranjan 08.01.2019 04:24

@xyz, что теперь имеет смысл, когда я прочитал это снова. Я слишком долго смотрел на это. Основная цель - сделать client.address адресом, чтобы я мог использовать его для интерполяции. Какие-либо предложения?

Tong 08.01.2019 04:29

Измените тип возвращаемого значения метода: getClients(customerId: number): Observable<Address> {}, также возможно имя метода, если он возвращает только адрес, а не полный клиент.

Ashish Ranjan 08.01.2019 04:31

В противном случае верните полного клиента, getClients (customerId: number): Observable <Client> {... return this.http.get <Client> (clientUrl)}. Выньте адрес, по которому вы подписываетесь. Получение полной версии клиента кажется лучшим вариантом

Ashish Ranjan 08.01.2019 04:42
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
18
5
73 851
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Спасибо, это было то, что я пытался сделать.

Tong 08.01.2019 19:12

сэр, вы можете сказать мне, как поступить, если client.address) будет нулевым?

Kapil Soni 28.10.2021 07:46

Другие вопросы по теме