簡體   English   中英

為 Singleton 的谷歌閉包編譯器評論 JavaScript

[英]Commenting JavaScript for Google Closure Compiler for Singleton

我試圖了解用於記錄 JavaScript 的 JSDoc 樣式,它與JavaScript Closure Compiler一起使用。 我有下面的 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}
           ^

function append返回對封裝 object 的引用。它返回的變量SingletonStringBuffer已聲明......所以我不確定哪里出了問題或如何更正它。

就編譯器而言,您還沒有創建命名類型。 對於這種情況,我希望您創建一個接口:

/** @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("");
    }
};
}());

單身人士在閉包中的工作方式不同。 我沒有看到它的顯式注釋,但編譯器(在高級模式下)對某些內置函數有一些了解 Singletons 將通過 goog.addSingletonGetter function 聲明,這是一個代碼示例

/**                                                                                 
 * @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}從未聲明為 class。

聚苯硫醚。 一些漫無邊際的事實。 我懷疑(但這是未經測試的)將構造函數設為私有可能會起作用。 注意示例中的尾隨下划線

/**
 * @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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM