为什么Closure Compiler不会对匿名函数返回的对象强制执行函数签名?

时间:2010-10-28 18:03:29

标签: google-closure-compiler

我正在创建具有私有/公共访问限制的对象,这些对象通常由Crockford推广。例如,我有这样的事情:

var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

如果我发出通话,例如

myPublicFunction();

Closure应该告诉我,我正在使用错误数量的参数调用一个函数。我尝试用myPublicFunction上的JavaDoc注释帮助Closure:

var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        /**
         * @param {string} str
         */
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

foo.myPublicFunction();

仍然没有抱怨。我为foo尝试了各种形式的JavaDocs,唯一有效的是将它记录为记录类型:

/**
 * @type {{myPublicFunction:function(string):string}}
 */
var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        /**
         * @param {string} str
         */
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

foo.myPublicFunction();

虽然有效,但编译器没有尝试强制myPublic对象函数实际上与我在JavaDoc的记录字段中记录的签名相匹配。所以只要我确保在这些返回的对象中记录我的所有函数并确保我的文档中的签名与我实际返回的内容一致,这将会起作用。我错过了一些更好的方法来强制执行此操作吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我实际上鼓励你看看使用伪经典继承,因为编译器可以消除皱纹。 Michael Bolin有一篇详细的文章描述了这个问题。

http://bolinfest.com/javascript/inheritance.php

答案 1 :(得分:0)

您尚未向“foo”提供任何类型信息。您已将类型信息提供给对象的属性(myPublicFunction)。

您的“记录类型”JsDoc实际上将类型信息放在“foo”上,因此它可以正常工作。

这是编译器的预期行为。