0

我有一个与这篇文章中描述的案例类似的案例。

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

export interface UserVerifyResponse {
    success: boolean
}

我的目标是创建一个 observable,它会根据用户是否经过验证返回一个布尔值。此代码适用于 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 响应映射到内部类或原语的方法(在其他地方我有一个使用http.get<T>. 6.3. 我可以按照上述帖子的答案中的描述重写所有这些,但我想返回一个布尔值,我认为我的方法看起来更清晰。

有什么建议么?

4

1 回答 1

0

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

当你写的时候this.http.get<boolean>,你是在说“这个 get 正在返回一个 boolean 类型的 Observable”,这不是你的意思。get 正在返回一个 Observable 类型UserVerifyResponse,你应该这样说:

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 从更改 UserVerifyResponseboolean最终返回的。

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

  • 你必须像它get()本身一样,因为 TypeScript 编译器无法正确推断类型,或者
  • 您正在编写一个公开可用的函数,就像 一样authenticate(),因为虽然 TypeScript 可以推断类型,但稍后阅读您的代码的人可能不能。
于 2018-11-10T16:56:50.627 回答