输入“无效|” Observable<any>' 不可分配给类型“ObservableInput<any>”。类型“void”不可分配给类型“ObservableInput<any>”

Gar*_*ald 4 rxjs typescript angular

我在 Visual Studio 代码中遇到此错误:

类型参数 '(query: string) => void | Observable' 不可分配给类型为 '(value: string, index: number) => ObservableInput' 的参数。输入“无效|” Observable' 不可分配给类型“ObservableInput”。类型“void”不可分配给类型“ObservableInput”

检查代码:

  public searchVal(val: string) {
    this.suggestions = (new Observable((observer: Observer<string>) => {
      observer.next(val);
    })).pipe(
      switchMap((query: string) => {
        if (query) { 
          return this.returnApiCall(query);  //THIS IS WORK WITH ONLY ONE RETURN
        }
        return of([]);
      })
    );
  }
Run Code Online (Sandbox Code Playgroud)

但这不适用于 if :

  public searchVal(val: string) {
    this.suggestions = (new Observable((observer: Observer<string>) => {
      observer.next(val);
    })).pipe(
      switchMap((query: string) => {
        if (query) { 
          if(this.serverApi === 'Driver'){
             return this.getAllDrivers(query);
          }else if(this.serverApi === 'Vehicle'){
             return this.getVehicle(query);
           }
        }
        return of([]);
      })
    );
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试返回一些其他 api 时,调用不起作用?

我的 API 调用是:

  returnApiCal(query: string) {
    return this.accountsService.getDrivers(query)
      .pipe(
        map((data: any) => {  
          return data.body || [];
        }),
        tap(() => noop, err => {
          this.errorMessage = err && err.message || 'Something goes wrong';
        })
      )
  }
Run Code Online (Sandbox Code Playgroud)

这一行是红线:

  switchMap((query: string) => { //here
Run Code Online (Sandbox Code Playgroud)

小智 5

确保你的 switchMap 的回调函数总是返回一些东西:

 public searchVal(val: string) {
    this.suggestions = (new Observable((observer: Observer<string>) => {
      observer.next(val);
    })).pipe(
      switchMap((query: string) => {
        if (query) { 
          if(this.serverApi === 'Driver'){
             return this.getAllDrivers(query);
          }else if(this.serverApi === 'Vehicle'){
             return this.getVehicle(query);
           }
          else { // you need to provide else here
            // return an observable when the two above conditions were not satisfied
          }
        }
        return of([]);
      })
    );
  }
Run Code Online (Sandbox Code Playgroud)