2012-04-08 4 views
1

JavaScript Closure Compilerで使用されているJSDoc style for documenting JavaScriptを理解しようとしています。私は以下のJavaScriptコードを持っていますシングルトンのGoogleクロージャコンパイラの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が宣言されているので、何が間違っているのか、それを修正する方法がわかりません。

答えて

2

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

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

etc 

これは(コードで(あなたは、高度なモードを使用している場合、それは削除されます)、またはあなたのexternファイルのいずれかで宣言することができますシンプルモードではコードなしで入力してください)。

次に、(あなたのケースで)そうようにそれを使用することができます:私は私にGOOG JSコードが入手できていないことを除いて

(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(""); 
    } 
}; 
}()); 
+0

インターフェイスを作成し、プロトタイプを自分の匿名関数内に設定できますか? – Eric

+0

一般に、関数内で名前付きの型(インターフェイスなど)を宣言することはできませんが、すぐに呼び出される匿名関数には特別な処理がいくつかあることがわかります。 しかし、ADVANCEDモードを使用している場合、コンパイラは匿名関数ラッパーをインライン化しようとします。保存したい場合は、コンパイル後に追加するために、コンパイラの出力ラッパーオプションを使用する必要があります。次に、すべての型を "グローバル"スコープで宣言します。これにより、より厳密なコードが作成されます。 – John

+0

それ以外の場合は、externsの使用を検討する必要があります。これをコードのコンシューマが利用できるようにすると、型チェックにも使用できます。 – John

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); 
+0

すべてが順調と良いです。 – Eric

+0

コンパイラを高度なモードで使いたいのであれば、コンパイラでうまくいくので、ライブラリからその関数を使うのはなぜですか?あなたはあなたがライブラリの中でコンパイルしたものだけを使うので、あなたはいくつかのかなり素晴らしいところで損失はありません。 – lennel

関連する問題