ng-docs / ng-docs.github.io

Angular 官方文档中文版预编译网站
https://angular.cn
Other
103 stars 22 forks source link

最新ng6 拦截器实现,一直报错 #14

Open fancyhejianyang opened 6 years ago

fancyhejianyang commented 6 years ago

核心代码:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpResponse<any>> {
        const authReq = req.clone({
            url: (req.url + '&token=ujusaruu19')
        });
        return next.handle(req).pipe(map((event: any) => {
            if (event instanceof HttpResponse && event.status === 200) {
                return req;
            } else {
                return of(event);
            }
        }),
            catchError((err: ErrorEvent) => {
                return err;
            })
        );
    }

问题: catchError中参数报错提示就是参数类型不一致无法赋予。。。

asnowwolf commented 6 years ago

map 语句的两个 return 类型导致的。catchError 的参数就是 map 的返回值。另外,建议不要使用 any 类型标注。这里的 map 参数是可以自动推断的,用 any 反倒模糊了类型。

fancyhejianyang commented 6 years ago

map 语句的两个 return 类型导致的。catchError 的参数就是 map 的返回值。另外,建议不要使用 any 类型标注。这里的 map 参数是可以自动推断的,用 any 反倒模糊了类型。

不用any类型的话应该用哪种呢,因为这里是必须要指明它的类型,另外2个return 这里如何改呢?谢谢赐教

asnowwolf commented 6 years ago

可以不指定,能自动推断。没记错的话类型应该是 HttpEvent。

asnowwolf commented 6 years ago

@fancyhejianyang 如果已解决,请回复一下,以便我改标签。

fancyhejianyang commented 6 years ago

解决了,改变写法(目前是这样的) intercept(req: HttpRequest<any>, next: HttpHandler) { const authReq = req.clone({ url: (req.url + '&token=ujusaruu19') }); //设置header啥的直接写在clone参数对象中,判断status需要下面这样写,不判断就不需要写,直接返回到handle(req) return next.handle(req).pipe(tap(res=>{})); }