如何检查(在运行时)未知对象是否为某种类型?然后正式将其转换为该类型并使用它做一些事情?
我想做这样的事情:
const /** {Object} */ someObject = {name: 'Apple', color: 'Red'};
if (someObject is Fruit) {
// Convert to {Fruit} and do something with it.
return /** {Fruit} */ (someObject);
}
其中Fruit
是一个具有属性名称和颜色的类。
更具体地说,我不能用构造函数创建Fruit
对象,因为我从JSON.parse
获取对象。
到目前为止,我已尝试过:
if (someObject instanceof Fruit)
这解决了错误。我试过了:
const aFruit = /** @type {Fruit} */ someObj;
但这实际上似乎没有做任何事情......也就是说,当我传入没有属性名称或颜色的someObj
时,它仍被视为Fruit
也许我需要一个更复杂/自定义的解决方案?即,这是内置于Closure还是我应该自己检查属性?
答案 0 :(得分:0)
HttpServletRequest
正是您要找的。这就是你如何检查是否从特定的构造函数(或更好的ES2015类)创建任何给定值。
instanceof
然而,在您的原始示例中,什么使对象成为水果?您正在使用匿名对象。具有const /** {Object} */ someObject = new Fruit('Apple', 'red');
if (someObject instanceof Fruit) {
// Convert to {Fruit} and do something with it.
return /** {Fruit} */ (someObject);
}
和name
属性的任何对象是否为水果?这有点不清楚,非常具体。你需要能够自己回答"什么使一个对象成为一个水果?"
如果要检查对象是否实现了Fruit接口(具有正确的属性),只需检查这些属性:
color
答案 1 :(得分:-1)
Closure的类型系统仅在编译时存在。
就像在C中一样,强制转换只是告诉类型系统“我保证这个值实际属于这种类型,即使你无法证明它。”
如果不是这样,则会出现未定义的行为(特别是使用高级优化)。