Задать вопрос
mitaichik
@mitaichik

Как приводить ответ HttpClient к конкретному типу?

Нужно, чтоб ответ HttpClient возвращал инстансы объектов. Например, есть метод:

getPersons(): Observable<Person[]> {
		return this.http.get<Person[]>("http://test/api/v1/persons");
	}

Я ожидаю, что он вернёт мне Observable со списком инстансов класса Person. То есть, он сам создаст инстансы Person и пихнёт туда данные (как, например делает, retrofit). Но по факту там массив Object. Неужели ангуляр из коробки так не умеет?

Да, стоит отметить что Person - это не интерфейс, а класс, имеющий методы. Соответственно, я хочу получить person, вызвать метод person.someMethod() - а он мне ошибку (так как это Object).

UPDATE

Разобрался, как сделать:

getPerson(id: number): Observable<Person> {

		let config = {params: {id: id.toString()}};

		return this.http
			.get<Person>("http://test/api/v1/person/view", config)
			.pipe(map(p => {
				let person = new Person();
				Object.assign(person, p);
				return person;
			}))
	}

Но неужели ангуляр не умеет так из коробки?
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    WEB-022 Разработка на Angular. Продвинутый уровень
    1 неделя
    Далее
  • Академия Эдюсон
    Frontend-разработчик + ИИ
    9 месяцев
    Далее
  • МИПО
    Бакалавриат Веб-разработка
    54 месяца
    Далее
Решения вопроса 1
@dmitrygavrish
Ангуляр тут ни при чем, он не может на основании типа, указанного в дженерике, создать инстанс класса, потому что это тип, а не конструктор класса.
Любой подобный пример в тайпскрипте вызовет ошибку:
function someFunction<T>(): T {
    return new T();
}

П.С. в вашем случае можно сделать несколько лаконичнее:
return this.http
    .get<Person>("http://test/api/v1/person/view", config)
    .map(p => new Person(p));

Только для этого конструктор класса Person должен уметь записывать себе внутрь св-ва из передаваемого в конструктор объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы