【问题标题】:Type 'Observable<boolean | {}>' is not assignable to type 'Observable<boolean>' error in unit test输入'可观察的<布尔值 | {}>' 不可分配给单元测试中的类型 'Observable<boolean>' 错误
【发布时间】:2020-05-23 23:23:03
【问题描述】:

我有一个简单的服务,可以发布数据并返回 true,否则会抛出错误。

首先通过getUserById获取用户数据,返回Promise(用户脱轨)

然后concatMap调用其他方法返回true!

// I want it's return type to be Observable<boolean>
saveUser(record: any): Observable<any> {
      return from(this.getUserById(1))
        .pipe(concatMap((data: any) => {
           // Some other code....
           return this.httpClient.post(`${this.API_URL}/users`, record)
            .pipe(
              map((result: any) => { 
                console.log(result);
                return true; 
              }), 
              catchError(error => this.handleError(error))
            )
        }));
}

我想要,它的返回类型是 Observable 但是当我更改为 Observable 布尔值时,立即开始出错。

刚刚在 [stackblitz.com/][1] 上创建了示例代码,看看我可以解决这个问题吗?

注意:除了saveUser(record: any),我无法更改任何方法

【问题讨论】:

  • 需要更多信息才能更具体,但 &lt;TypeA | TypeB&gt; is not assignable to &lt;TypeA&gt; 在您将值设置为 TypeB 时发生,然后再将其设置为预期的 TypeA。在您的情况下,您在给它一个布尔值之前将它定义为一个空对象。
  • 不要定义 getDataany,而是尝试完全按照您的意愿定义它:getData(): boolean 和 TS 编译器应该能够查明 getData 返回类型 @ 的位置的错误987654328@
  • @Z.Bagley: getData 是一个返回完整用户详细信息的现有方法,已经在 100 个地方使用,我无法更改任何现有代码
  • 它是否准确返回UserDataUserData,您提到了UserDetail,所以在那里检查)?如果正确,请更改为userDetail: any 并检查它是否通过。我们无法判断错误发生在哪一行,因此如果仍然失败,则可能是在 utilityService.CheckFeature 方法本身中。如果您能提供,该代码可能会很有用。

标签: angular rxjs


【解决方案1】:

你可能会尝试做这样的事情:

myObs: Observable<boolean> = isUserAllowed()

this.utilityService.CheckFeature(userDetail);

返回Observable&lt;boolean | {}&gt;

所以myObs 不知道{} 到达时会发生什么。

您需要将返回值转换为特定的Observable&lt;boolean&gt;,以便打字稿知道。

类似于:

this.utilityService.CheckFeature(userDetail) as Observable&lt;boolean&gt;

检查这个: https://stackblitz.com/edit/angular-bw7hf2

【讨论】:

    【解决方案2】:

    最后,我让函数像 Promise 一样工作,然后使用 then 并用 from() 包装整个函数以返回 observable。

    isUserAllowed(): Observable<any> {
        return from(this.getData().then((userDetail: UserData) => {
           return this.utilityService.CheckFeature(userDetail); 
        }), catchError(error => this.handleError(error)));
    

    【讨论】:

    • CheckFeature 的返回变量是否在设置为 truefalse 之前声明了?你让它对/错,砰砰。它可能会返回一个空值(而不是 false)bang-bang,但是您的 bang bang (!!) 将其击毙(将空值变为 false)。
    • 不,只是添加了该运算符以转换为纯布尔值
    猜你喜欢
    • 2020-01-06
    • 2021-08-17
    • 2016-11-12
    • 2023-01-18
    • 2019-04-22
    • 1970-01-01
    • 2017-12-18
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多