[英]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.