TypeScript - instanceof 不适用于 JSON

Posted

技术标签:

【中文标题】TypeScript - instanceof 不适用于 JSON【英文标题】:TypeScript - instanceof does not work for JSON 【发布时间】:2018-03-17 21:05:10 【问题描述】:

我正在使用 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。

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

【问题讨论】:

【参考方案1】:

JSON.parse 返回一个没有原型的对象,因此 instanceof 永远无法工作。如果您的 json 包含“类型”信息,那么您可以使用它进行比较,或者您必须比较某些属性是否存在以识别正确的对象。

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

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

【讨论】:

您指出对象没有原型,这一点很好。我会等着看他们是否有其他解决方法,如果没有,我会采取你的方法。【参考方案2】:

你永远不会达到“条件 1”或“条件 2”,因为 'instanceof' 运算符测试原型链:

instanceof 操作符测试一个对象的原型属性是否 构造函数出现在对象原型链中的任何位置。

JSON.parse()的返回值为:

与给定 JSON 文本对应的 Object。

JSON.parse() 不能确定类型,它只是返回一个Object 实例而不是HTTPErrorJavaError 实例,你应该测试特殊属性而不是使用instanceof 运算符:

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

...

【讨论】:

以上是关于TypeScript - instanceof 不适用于 JSON的主要内容,如果未能解决你的问题,请参考以下文章

为啥 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指一种类型,但在这里被用作值。”?

为自定义打字稿错误实例实施 instanceof 检查?

TypeScript系列教程08运算符

LayaBox---TypeScript---高级类型

TypeScript 学习笔记 — 类型推断和类型保护

instanceof