为什么 RxJS 升级到 v6.3 后 map 不工作

Why map doesn't work after upgrading RxJS to v6.3

我有一个与 中描述的案例类似的案例。

我有一个用户登录服务,它(除其他外)验证用户的令牌是否仍然有效。服务器的响应在接口中定义:

export interface UserVerifyResponse {
    success: boolean
}

我的目标是创建一个可观察对象,它将 return 一个布尔值,具体取决于用户是否经过验证。此代码适用于 RxJS v6.2:

authenticate(): Observable<boolean> {
    return this.http.get<boolean>(
        this.apiUrl+'/verify_user'
    ).pipe(
        map<UserVerifyResponse, boolean>((receivedData: UserVerifyResponse) => {
            return receivedData.success;
        }),
        tap((data: boolean) => {console.log("User authenticated", data)}),
        catchError(this.handleError)
    )
}

但是,现在我已经将 RxJS 更新到 v6.3,我收到了这个错误:

ERROR in src/app/login/user.service.ts(50,13): error TS2345: Argument of type 'OperatorFunction<UserVerifyResponse, boolean>' is not assignable to parameter of type 'OperatorFunction<boolean, boolean>'.
  Type 'UserVerifyResponse' is not assignable to type 'boolean'.

这让我很困扰,因为我使用这种方法将 API 响应映射到内部 class 或原语(在其他地方我有一个使用 http.get<T> 的服务)和现在我想知道我是否应该强制使用 RxJS 6.2,或者有一种简单的方法可以迁移到 6.3。我可以按照上面提到的 post 的答案中的描述重写所有这些,但我想 return 一个布尔值,我认为我的方法看起来更清晰。

有什么建议吗?

显然,他们改进了类型检查。

当您写 this.http.get<boolean> 时,您说的是 "this get is returning an Observable of type boolean",这 不是 您的意思。 get 返回一个 UserVerifyResponse 类型的 Observable,你应该这么说:

authenticate(): Observable<boolean> {
    return this.http.get<UserVerifyResponse>(
        this.apiUrl+'/verify_user'
    ).pipe(
        map((receivedData) => {
            return receivedData.success;
        }),
        tap((data) => {console.log("User authenticated", data)}),
        catchError(this.handleError)
    )
}

管道将 Observable 从 UserVerifyResponse 更改为最终返回的 boolean

请注意,我已经删除了您输入的大部分内容。通常,您应该只在以下情况下指定类型:

  • 你必须这样做,就像 get() 本身一样,因为 TypeScript 编译器无法正确推断类型,
  • 你正在编写一个公开可用的函数,就像 authenticate() 的情况一样,因为虽然 TypeScript 可以推断类型,但稍后阅读你的代码的人可能不能。