1

如何通過Google Closure Compiler Advance模式運行以下代碼時擺脫警告?Google Closure編譯器,處理JSC_INEXISTENT_PROPERTY警告

var defaults = { 
    team : 'ABC', 
    wr: 'Calvin', 
    qb: 'Manning' 
}; 

var config = {}; 

var setters = { 
    team : function(){ return defaults.team}, 
    wr : function(){ return defaults.wr} 
}; 

for(var i in setters){ 
    config[i] = setters[i].call(); 
} 


alert(config.team); 
alert(config.wr); 

數警告:2

JSC_INEXISTENT_PROPERTY: Property team never defined on config at line 19 character 7 
alert(config.team); 

^
JSC_INEXISTENT_PROPERTY: Property wr never defined on config at line 20 character 7 
alert(config.wr); 


^

回答

2

發現了它。

@lends會訣竅。

lends tag

var defaults = { 
    team : 'ABC', 
    wr: 'Calvin', 
    qb: 'Manning' 
}; 
var config = {}; 


var setters = 
/** @lends {config} */ 
{ 
    team : function(){ return defaults.team}, 
    wr : function(){ return defaults.wr} 
}; 

for(var i in setters){ 
    config[i] = setters[i].call(); 
} 


alert(config.team); 
alert(config.wr); 
0

我想你應該定義這些屬性與空值,所以編譯器會知道這件事。

var config = { 
    team: null, 
    wr: null 
}; 

和建議2號(我不知道這個):嘗試註釋類型的配置。事情是這樣的:

/** @type {{team: *, wr: *}} */ 
var config = {}; 

OR使用克隆:

var config = goog.object.clone(setters); 
goog.object.forEach(config, function(val, key) { 
    config[key] = val.call(); 
}); 
+0

感謝。事情是配置有超過75個屬性,使用第一種技術會很麻煩。同樣適用於第二個 – sbr

+0

'config ['team']'方法怎麼樣? – Tony

+0

或'clone'。看到我更新的答案。 – Tony

0

作爲替代方案,你可以註釋類型爲進一步泛化:

/** @type {Object} */ var config = {}; // allow any prop defined anywhere on any object. 

或更具體:

/** @type {{team:(string|undefined), wr:(string|undefined), qb:(string|undefined)}} */ var config = {}; // "team", "wr" and "qb" are expected.