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.