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
が宣言されているので、何が間違っているのか、それを修正する方法がわかりません。
インターフェイスを作成し、プロトタイプを自分の匿名関数内に設定できますか? – Eric
一般に、関数内で名前付きの型(インターフェイスなど)を宣言することはできませんが、すぐに呼び出される匿名関数には特別な処理がいくつかあることがわかります。 しかし、ADVANCEDモードを使用している場合、コンパイラは匿名関数ラッパーをインライン化しようとします。保存したい場合は、コンパイル後に追加するために、コンパイラの出力ラッパーオプションを使用する必要があります。次に、すべての型を "グローバル"スコープで宣言します。これにより、より厳密なコードが作成されます。 – John
それ以外の場合は、externsの使用を検討する必要があります。これをコードのコンシューマが利用できるようにすると、型チェックにも使用できます。 – John