Angular& TypeScript:类实例检查不起作用

时间:2017-08-21 12:39:41

标签: angular typescript

我试图检查从Web服务返回的错误类型。问题是instanceof检查不起作用。 if没有工作。

触发对WS的调用的组件类方法:

public performSearch(keyword: string) {
    this.searchService.searchWithQuery(keyword)
      .subscribe(
        response => {
          this.searchResults = JSON.parse(response._body);
        },
        (error: AppError) => {
          console.log('error instance');
          console.log(error);
          if (error instanceof NotFoundError) {
            this.snackBar.open('404 Not Found', 'X', {
              duration: 5000,
            });
          }
          if (error instanceof AccessDeniedError) {
            this.snackBar.open('401 Access Denied', 'X', {
              duration: 5000,
            });
          }
          if (error instanceof BadInputError) {
            this.snackBar.open('400 Bad Input', 'X', {
              duration: 5000,
            });
          }
          if (error instanceof AppError) {
            this.snackBar.open('General Error', 'X', {
              duration: 5000,
            });
          }
        });
  }

扩展基本服务类的search.data.service类:

searchWithQuery(query: string) {
    let headers = new Headers();
    headers.append('Authorization', 'Bearer ' + this.tokenValue);
    return this.http.get(this.gatewayUrl + this.serviceName + this.withQuery + query, {
      headers: headers
    })
      .catch(this.handleError);
  }

  private handleError(error: Response): ErrorObservable {
    if (error.status === 404)
      return Observable.throw(new NotFoundError(error.json()));
    if (error.status === 400)
      return Observable.throw(new BadInputError(error.json()));
    if (error.status === 401) {
      return Observable.throw(new AccessDeniedError(error.json()));
    }

    return Observable.throw(new AppError(error.json()));
  }

AppError.ts类

export class AppError {
  constructor(public originalError?: any) {
  }
}

其余的错误类只是扩展它,例如:

export class AccessDeniedError extends AppError {
}

当我尝试记录error的{​​{1}}时,我在控制台中得到了这个非常奇怪的内容:

AppError

1 个答案:

答案 0 :(得分:2)

正如错误消息所示,错误不是上述问题,而是TypeError,这是因为没有Observable.throw方法。

除非使用import 'rxjs/Rx'导入整个RxJS包,否则应显式导入throw,与任何其他RxJS运算符或可观察方法一样:

import 'rxjs/add/observable/throw';

在TypeScript编译期间应该检测到这种错误,因此不需要在运行时调试它们。