1

JavaScriptClosureCompilerで使用されるJavaScriptを文書化するためのJSDocスタイルを理解しようとしています。私は以下の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が宣言されているので、何が間違っているのか、どのように修正するのかわかりません。

4

2 に答える 2

2

コンパイラに関する限り、名前付き型は作成していません。この場合、インターフェイスを作成することを期待します。

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

etc

これは、コード(詳細モードを使用している場合は削除されます)またはexternファイル(シンプルモードでコードなしのタイプが必要な場合)のいずれかで宣言できます。

その後、次のように使用できます(あなたの場合):

(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("");
    }
};
}());
于 2012-04-09T20:30:22.707 に答える
1

シングルトンは、クロージャーでの動作が異なります。明示的なアノテーションは見ていませんが、コンパイラー(詳細モード)は、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);
于 2012-04-09T07:45:17.327 に答える