【问题标题】:Rxjs concatMap return type to Observable<boolean>Rxjs concatMap 返回类型为 Observable<boolean>
【发布时间】:2020-02-13 16:51:22
【问题描述】:
  1. 我有一项服务正在返回承诺
  2. 其他正在发布数据并返回已保存的数据
  3. 保存成功后返回true

所以方法的返回类型应该是Observable&lt;boolean&gt;而不是Observable&lt;any&gt;,这里是代码

// 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&lt;boolean&gt;,但是当我更改为 Observable 时,立即开始出错。

查看StackBlitz上的工作示例代码

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

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    问题在于您的catchError 函数。

    如果你抛出,没有返回类型,函数不返回。

    你可以处理错误并返回一个 observable:

    private handleError(error: Response | any): Observable<boolean> {
      return of(false);
    }
    

    【讨论】:

      【解决方案2】:

      这是处理方法的正确方法:

      首先,正如documentation 中所述,throwError 返回Observable&lt;never&gt;。实际上,不需要将参数键入为 Responseany 的联合类型。这就是你应该如何定义你的 handleError 方法(而不是将返回类型设置为any):

      private handleError(error: Response): Observable<never> {
        return throwError(error);
      }
      

      然后,在您的saveUser 方法上,它可以返回booleannever 类型的可观察对象。所以返回类型应该是Observable&lt;boolean | never&gt;

      saveUser(record: any): Observable<boolean | never> {
        return from(this.getUserById(1))
          .pipe(concatMap((data: any) => {
              return this.httpClient.post(`${this.API_URL}/users`, record)
              .pipe(
                map((result: any) => { 
                  console.log(result);
                  return true; 
                }), 
                catchError(error => this.handleError(error))
              )
          }));
      }
      

      这里是 working demo,没有任何 TypeScript 错误。

      【讨论】:

        【解决方案3】:

        我说这只是一个 linting 问题对吗?

        您说您可以更改 saveUser,所以我假设您不能更改 handleError 以返回 Observable&lt;boolean&gt; 以满足您的目的。

        相反,您可以通过重新声明您正在调用的其他函数的类型化版本来强制 typescript 运行:

        saveUser(record: any): Observable<boolean> {
          const _catchError: OperatorFunction<any, boolean> = catchError(error => this.handleError(error));
          return from(this.getUserById(1))
            .pipe(concatMap((data: any) => {
                return this.httpClient.post(`${this.API_URL}/users`, record)
                .pipe(
                  map((result: any): boolean => { 
                    console.log(result);
                    return true; 
                  }), 
                  _catchError
                )
            }));
        }
        

        编辑:工作演示:https://stackblitz.com/edit/angular-s4zw4q

        【讨论】:

          猜你喜欢
          • 2019-12-25
          • 1970-01-01
          • 2017-06-29
          • 1970-01-01
          • 2019-01-26
          • 1970-01-01
          • 2020-12-21
          • 2019-05-21
          • 1970-01-01
          相关资源
          最近更新 更多