Javascript 在闭包中检测接口和duck类型

Javascript 在闭包中检测接口和duck类型,javascript,google-closure-compiler,google-closure,Javascript,Google Closure Compiler,Google Closure,闭包库中有几个地方,其中接口有一对函数来对接口执行运行时类型检查(类似于)。我不完全喜欢这个解决方案,因为我有一些非常简单的东西。有没有办法在启用高级优化的情况下进行duck键入?假设我有一个接口和一个组件,该组件对具有该接口的儿童执行特殊操作,例如: /**@接口*/ MyInterface=function(){}; MyInterface.prototype.doSomething=函数(){}; /** *@constructor *@extends{goog.ui.Component

闭包库中有几个地方,其中接口有一对函数来对接口执行运行时类型检查(类似于)。我不完全喜欢这个解决方案,因为我有一些非常简单的东西。有没有办法在启用高级优化的情况下进行duck键入?假设我有一个接口和一个组件,该组件对具有该接口的儿童执行特殊操作,例如:

/**@接口*/
MyInterface=function(){};
MyInterface.prototype.doSomething=函数(){};
/**
*@constructor
*@extends{goog.ui.Component}
*/
MyComponent=函数(){
...
};
/**@doc*/
MyComponent.prototype.addChild=函数(子对象,选项渲染){
goog.base(这是'addChild',child,opt_render);
if(儿童剂量){
儿童。doSomething();
}

};这就是添加
@record
的目的。您需要使用最新版本的编译器来使用它(至少是2016年的版本)


只需将
@interface
替换为
@record
,您就可以获得所需的行为。编译器将始终如一地对事物进行重命名。

我将Chad的答案作为解决方案,但在编译工作完成后,我再次讨论了这个问题,为了子孙后代,我将发布一个关于duck类型的更详细的答案

您可以在上使用高级优化执行动态向下广播,如下所示:

var maybeRecordType = /** @type {MyRecordType} */ (someObject);
if ( maybeRecordType.propertyInQuestion ) {
  maybeRecordType.propertyInQuestion();
}

如果传递的两个可能的类型之间的属性名发生冲突,则显然会以这种方式丢失编译时检查,但duck类型总是有风险的。

谢谢,我不知道
@record
,通常它看起来非常有用。对于我在这里进行的类型缩小,我不确定它是否添加了任何内容——我仍然希望检查隐式接口。在第一篇文章之后,我意识到我可以将变量类型转换到接口,然后检查属性-这只适用于
@record
还是仍然适用于
@interface
?如果接口上没有明确的
@implements
注释,对象将不匹配接口。它只需拥有一个匹配的签名就可以匹配一个记录。您仍然需要您的联合类型来告诉
addChild
方法可以传入接口。