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;
			}))
	}


Но неужели ангуляр не умеет так из коробки?
  • Вопрос задан
  • 82 просмотра
Решения вопроса 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 должен уметь записывать себе внутрь св-ва из передаваемого в конструктор объекта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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