угловой RXJS как задать тип ответа на подписку

#angular #rxjs #subscribe

Вопрос:

Я написал серверную часть, поэтому я точно знаю формат данных (DTO), которые возвращаются с моего контроллера. Когда я выполняю такой пост, как:

 await this.http.post(this.baseUrl   'account/login', dto).subscribe(
  (response) => {
 

если попытаться указать ответ: например, UserDTO, я получу ошибку:

введите описание изображения здесь

Я также попытался привести ответ к другой переменной типа UserDTO, но это также не удается. Я не могу вспомнить, чтобы у меня была эта проблема раньше (например, более ранние угловые версии??).

Это должно быть просто — мои извинения за то, что я не понимаю, как это сделать. к вашему сведению: версия ng 12.1.1

Заранее спасибо. Зажимной патрон

Комментарии:

1. Вы могли бы использовать общий пост. this.http.post<UserDto>(this.baseUrl 'account/login', dto)

Ответ №1:

Используя нестандартную форму post метода, вы получите тип ответа Observable<HttpResponse> . Поэтому, если вы не передадите и не сопоставите ответ самостоятельно, ответ в вашей подписке будет иметь тип HttpResponse , поэтому вам придется получить тело из HttpResponse .

 this.http.post(this.baseUrl   'account/login', dto).subscribe(
  (response: HttpResponse) => {
    const userDto: UserDto = response.body as UserDto
  }
);
 

В качестве альтернативы вы можете использовать общую форму post метода, которая будет содержать тип для сопоставления…

 this.http.post<UserDto>(this.baseUrl   'account/login', dto).subscribe(
  (response: UserDto) => {
    // The response is already map and typed to your UserDto.
  }
);
 

https://angular.io/api/common/http/HttpResponse

https://angular.io/api/common/http/HttpClient#post

Ответ №2:

subscribe() метод возвращает экземпляр объекта RxJS Subscription , которого вы не можете дождаться. Вы можете ждать только обещаний, поэтому вам нужно преобразовать наблюдаемое в обещание:

 await response = await this.http.post(this.baseUrl   'account/login', dto).toPromise();
 

Обратите внимание, что в RxJS 8 toPromise() будут заменены два метода firstValueFrom() и lastValueFrom() .