为什么 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 可以推断类型,但稍后阅读你的代码的人可能不能。
我有一个与
我有一个用户登录服务,它(除其他外)验证用户的令牌是否仍然有效。服务器的响应在接口中定义:
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 可以推断类型,但稍后阅读你的代码的人可能不能。