TypeScript - instanceof不适用于JSON

时间:2017-10-06 06:07:27

标签: json typescript ionic3

我正在使用IONIC v3.0.1并尝试确定从服务器收到的错误类型。样本错误响应是

// HTTP Errors
{"error":"unauthorized","error_description":"long error description"}

// Java Exception
{"timestamp":00000000000,"status":500,"error":"Internal Server Error","exception":"java.lang.Exception","message":"Java Exception","path":"/app/login"}

我创建了各自的类来表示这些不同的错误

// for HTTP Error
export class HTTPError {
  constructor() {

  }

  public error: string;
  public error_description: string;
}


// for Java Error
export class JavaError {
  constructor() {

  }

  public error: string;
  public exception: string;
  public message: string;
  public path: string;
  public status: number;
  public timestamp: Date;
}

我试图通过使用instanceof关键字

来确定错误类型
...
let error: any = JSON.parse(response);
if (error instanceof HTTPError) {
  // Condition Block 1
} else if (error instanceof JavaError) {
  // Condition Block 2
} else {
  // Condition Block 3
}
...

对于任何响应,执行进入条件块3。 if条件总是评估为false。

我在这里做错了什么???

2 个答案:

答案 0 :(得分:3)

JSON.parse返回一个没有原型的Object,因此instanceof无法工作。如果你的json包含"输入"然后您可以使用它来进行比较,或者您必须比较是否存在某些属性以识别正确的对象。

唯一的选择是检查它是否具有属于类的任何属性..

if(error.error){
   if(error.error_description){
       // this is HttpError
   }
   else if(error.exception){
       // this is JavaError
   }
}else{
     // success...
}

答案 1 :(得分:2)

你永远不会达到"条件1"或者"条件2"因为' instanceof'操作员测试原型链:

  

instanceof运算符测试是否为a的prototype属性   构造函数出现在对象的原型链中的任何位置。

JSON.parse()的返回值为:

  

与给定JSON文本对应的Object

JSON.parse()无法确定类型,它只返回Object实例NOT HTTPErrorJavaError实例,您应该测试特殊属性而不是使用instanceof操作者:

...
let resp: any = JSON.parse(response);
if (resp.error) {
   if (resp.error_description) {
      // handle HTTPError
   } else if (resp.exception) {
      // handle JavaError
   }
}
...