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 实例而不是HTTPError
或JavaError
实例,你应该测试特殊属性而不是使用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' 仅指一种类型,但在这里被用作值。”?