类型‘ void’不能赋值给类型‘ Observer ableInput < {} >’

这个错误在我迁移到 TS 2.2.2之后开始出现,所以我假设这就是问题所在... ... 代码没有停止工作,但是现在我收到了这个错误,我尝试了一些事情,比如返回一个空的可观察对象,捕捉重新抛出的异常并返回一个对象,但似乎没有什么工作。为什么现在会这样?它难道不应该理解我在重新引发异常而不期望返回吗?我看错了吗?

这是完整的错误描述:

enter image description here

这是完整的密码:

return request
.map((res: Response) => res.json())
.catch((error: any) => {
// todo: log?


if (error.status == 500) {
this.alertService.showError(error.statusText);
} else if (error.status == 588) {
this.alertService.showAlert(error.statusText);
}


Observable.throw(error.statusText);
});

我尝试返回 Observer,但是包装器方法期望返回类型为 T的返回,这是反序列化请求(map(...))的返回。如果我返回 throw,我会得到这个错误:

[ ts ]类型“可观察的”是不可赋值给类型“ T”的

我在用:

  • 角4
  • 打印稿2.2.2
126765 次浏览

你必须归还观察者

 return request
.map((res: Response) => res.json())
.catch((error: any) => {
// todo: log?


if (error.status == 500) {
this.alertService.showError(error.statusText);
} else if (error.status == 588) {
this.alertService.showAlert(error.statusText);
}


return Observable.throw(error.statusText);
});

有时当你不使用箭头函数调用 catch 时,如下所示

getUserList() {
return this.http.get(this.constURL + '/api/url/here', this.headerOptions)
.catch(this.handleError);
}


handleError(error: Response) {
if (error.status == 500) {
this.router.navigate(['/login']);
} else {
return Observable.throw(error);
}
}

那么它给出了错误的

错误类型错误: 无法读取未定义的属性“导航”,没有得到这个

因为在 handleError 函数中这个对象是不可访问的. . 如果你控制 this. router,那么你会得到未定义的. 。 所以这个对象不工作,没有得到路由器所有可用的方法

所以你必须像下面这样使用箭头函数

getUserList() {
return this.http.get(this.constURL + '/api/url/here', this.headerOptions)
.catch(error => {
return this.handleError(error);
});
}


handleError(error: Response) {
if (error.status == 500) {
this.router.navigate(['/login']);
} else {
return Observable.throw(error);
}
}

另外,如果你没有提到返回的 handlerError 函数,那么它将抛出错误再次喜欢

类型为’(error: any) = > void’的参数不能赋给类型为’(error: any) = > void’的参数

因此,有必要为 handlerError 函数键入 return。

详细检查 给你。他已经很好地解释了所有可能的错误和解决方案的代码。对我来说很有用

这是 RXJS6的角度6的答案。 在请求函数中,它看起来类似于。请注意,catch已经被 catchError取代,而 Observable.throw现在是 throwError。同样在 RXJS6中,我们使用管道将我们希望执行的一系列功能连接在一起,而不是先前的点链接。

//In your service


getData(url: string): Observable<any> {
let options = this.getHTTPOptions();
return this.http.get<any>(url, options).pipe(
catchError( (err: any, caught: Observable<any>) => { return
throwError(this.generalErrorHandler(err, caught)) } ) );
}

然后您可以拥有一个错误处理程序。关键是在上面的 catchError函数中指定关键字 return,并在处理程序中返回错误。 箭头(=>)允许您将调用函数的上下文传递到错误处理程序,这意味着您可以做一些很酷的事情,比如 this.router.navigate(['someroute']);(如果您的服务中导入了路由器)

//In your service


generalErrorHandler(error: any, caught: Observable<any>): Observable<any> {
console.log('error caught: ', error);
if( error.error.status == "INVALID_TOKEN" || error.error.status == "MAX_TOKEN_ISSUE_REACHED"){
console.log('token has expired');
this.logout();
return error;
}
return error;
}

为了实现这一目标,一些关键的进口产品是:

//Imports for the service


import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Http, Response } from '@angular/http';
import { catchError, map } from 'rxjs/operators';
import { Observable, throwError, of} from 'rxjs';

最后,订阅获取数据的请求:

//In your component, don't forget to import your service


let response$ = this.someService.getData('url here');
response$.subscribe(
data => { console.log('do stuff to data here', data); },
err => { console.log("couldn't get data, maybe show error to user"); },
() => { console.log('function that is called upon finish'); }
);
 return Observable.throw(error);

Throw 不推荐在拦截器中使用这样的 throwError 操作符

intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
return next.handle(request).pipe(
catchError(err => {
if (err.status === 401) {
// remove Bearer token and redirect to login page
this.router.navigate(['/auth/login']);
}
return throwError( err );
}));
}

目前与角度14你可以做抛出错误与 Error(err.error.message);和问题已经为我去。

例如:

 handleError(err: any): Observable<any>
{return new Error(err.error.message);}