检查对象是否为Google Closure中的Type,并进行转换?

时间:2017-06-27 00:20:43

标签: javascript types google-closure-compiler typechecking

如何检查(在运行时)未知对象是否为某种类型?然后正式将其转换为该类型并使用它做一些事情?

我想做这样的事情:

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还是我应该自己检查属性?

2 个答案:

答案 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中一样,强制转换只是告诉类型系统“我保证这个值实际属于这种类型,即使你无法证明它。”
如果不是这样,则会出现未定义的行为(特别是使用高级优化)。