簡體   English   中英

Angular和TypeScript:類實例檢查不起作用

[英]Angular & TypeScript: Class instance check doesn't work

我正在嘗試檢查從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 {
}

當我嘗試記錄AppErrorerror ,我在控制台中得到了這個,這很奇怪:

TypeError: __WEBPACK_IMPORTED_MODULE_2_rxjs_Observable__.Observable.throw is not a function
    at CatchSubscriber.webpackJsonp.../../../../../src/app/common/services/search.data.service.ts.SearchDataService.handleError [as selector] (search.data.service.ts:52)
    at CatchSubscriber.webpackJsonp.../../../../rxjs/operator/catch.js.CatchSubscriber.error (catch.js:104)
    at XMLHttpRequest.onLoad (http.es5.js:1231)
    at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
    at Object.onInvokeTask (core.es5.js:3881)
    at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:191)
    at ZoneTask.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:498)
    at invokeTask (zone.js:1370)
    at XMLHttpRequest.globalZoneAwareCallback (zone.js:1388)

如錯誤消息所述,該錯誤不是上述所有錯誤,而是TypeError ,這是由沒有Observable.throw方法的事實引起的。

除非整個RxJS軟件包是通過import 'rxjs/Rx' throw應該像其他RxJS運算符或可觀察方法一樣顯式導入:

import 'rxjs/add/observable/throw';

應該在TypeScript編譯期間檢測到此類錯誤,因此無需在運行時對其進行調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM