【问题标题】:Commenting JavaScript for Google Closure Compiler for Singleton为 Singleton 的 Google Closure Compiler 评论 JavaScript
【发布时间】:2012-04-21 00:33:34
【问题描述】:

我试图了解与JavaScript Closure Compiler 一起使用的JSDoc style for documenting JavaScript。我有下面的 JavaScript 代码

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==

(function(){
    /**
     * @type Array.<string>
     * @private
     */
    var sb = [];

    /**
     * @const
     * @type{{append: function(string): SingletonStringBuffer, toString: function(): string}}
     */
    window['SingletonStringBuffer'] = {
        /**
         * @param {string} text
         * @return {SingletonStringBuffer}
         */
        append: function(text){
            sb.push(text);
            return SingletonStringBuffer;
        },
        /**
         * @return {string}
         */
        toString: function(){
            return sb.join("");
        }
    };
}());

当我对此代码进行高级编译时,我收到 2 个警告。

JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type SingletonStringBuffer at line 10 character 35
* @type{{append: function(string): SingletonStringBuffer, toString: function()...
                                   ^ JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type SingletonStringBuffer at line 15 character 11
* @return {SingletonStringBuffer}
           ^

函数append 返回对封装对象的尊重。它返回的变量SingletonStringBuffer 已声明...所以我不确定出了什么问题或如何纠正它。

【问题讨论】:

    标签: javascript comments google-closure-compiler jsdoc


    【解决方案1】:

    就编译器而言,您还没有创建命名类型。对于这种情况,我希望您创建一个接口:

    /** @interface */
    function StringBuffer() {
    }
    /**
     * @param {string} text
     * @return {StringBuffer}
     */
    StringBuffer.prototype.append;
    
    etc
    

    这可以在代码中声明(如果您使用高级模式,它将被剥离)或在您的外部文件中(如果您希望在简单模式下没有代码的类型)。

    然后您可以像这样使用它(在您的情况下):

    (function(){
    /**
     * @type Array.<string>
     * @private
     */
    var sb = [];
    
    /**
     * @const
     * @type {StringBuffer}
     */
    window['SingltonStringBuffer'] = {
        /**
         * @param {string} text
         * @return {StringBuffer}
         */
        append: function(text){
            sb.push(text);
            return SingltonStringBuffer;
        },
        /**
         * @return {string}
         */
        toString: function(){
            return sb.join("");
        }
    };
    }());
    

    【讨论】:

    • 我可以在匿名函数中创建接口并设置原型吗?
    • 通常,您不能在函数中声明命名类型(例如接口),但我知道对于立即调用的匿名函数有一些特殊处理。但是,如果您使用 ADVANCED 模式,编译器将尝试内联您的匿名函数包装器。如果要保留它,则应使用编译器的输出包装器选项在编译后添加它。然后,您在“全局”范围内声明所有类型。这将导致代码更紧凑。
    • 否则,您应该考虑使用 externs。如果您将其提供给代码的使用者,他们也可以将其用于类型检查。
    【解决方案2】:

    单例在闭包中的工作方式不同。我没有看到它的显式注释,但是编译器(在高级模式下)对某些内置函数有一些了解 单例将通过 goog.addSingletonGetter 函数声明,这是一个代码示例

    /**                                                                                 
     * @constructor                                                                     
     * @extends {path.to.BaseClass}                                                 
     */
    path.to.MyClass = function() {
      goog.base(this);
    };
    
    goog.inherits(path.to.MyClass, path.to.BaseClass);
    goog.addSingletonGetter(path.to.MyClass);
    

    就是这样。

    PS 你得到了错误的注释,因为{SingltonStringBuffer} 从未被声明为一个类。

    PPS。 有些人在事后胡言乱语。 我怀疑(但这是未经测试的)将构造函数设为私有可能会起作用。注意示例中的尾随下划线

    /**
     * @private -> NOTE THIS IS IN NO WAY VERIFIED                                                                                
     * @constructor                                                                     
     * @extends {path.to.BaseClass}                                                 
     */
    path.to.MyClass_ = function() {
      goog.base(this);
    };
    goog.inherits(path.to.MyClass, path.to.BaseClass);
    goog.addSingletonGetter(path.to.MyClass);
    

    【讨论】:

    • 一切都很好,只是我没有可用的 goog JS 代码。
    • 如果您想在高级模式下使用编译器,那么为什么不直接使用库中的那个函数,因为它与编译器配合得很好。您只使用您在库中编译的内容,因此您不会损失一些非常棒的收益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2014-10-15
    • 2011-05-12
    • 2011-08-06
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多