angular RXJS 如何转换订阅响应类型

angular RXJS how to cast subscribe response type

我编写了后端,因此我准确地知道从我的控制器返回的数据 (DTO) 的格式。 当我执行 post 时:

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

如果尝试指定响应:例如 UserDto,我会收到错误消息:

我也尝试过将响应强制转换为另一个 UserDto 类型的变量,但同样失败。我不记得以前有过这个问题(比如早期的 Angular 版本??)。

这必须很简单 - 我很抱歉不明白如何去做。 仅供参考:ng 版本 12.1.1

提前致谢。 查克

subscribe() 方法 returns 你不能等待的 RxJS Subscription 对象实例。您只能等待 Promise,因此您需要将 Observable 转换为 Promise:

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

注意,在 RxJS 8 中 toPromise() 将被两个方法 firstValueFrom()lastValueFrom() 取代。

通过使用 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