Google Closure Compiler, обрабатывая предупреждение JSC_INEXISTENT_PROPERTY
Как избавиться от предупреждений о запуске следующего кода в расширенном режиме компилятора Google Closure?
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);
^
3 ответа
Решение
Нашел это.
@lends делает свое дело.
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);
В качестве альтернативы вы можете аннотировать тип как более общий:
/** @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.
Я думаю, вы должны определить эти свойства с нулевым значением, чтобы компилятор знал об этом.
var config = {
team: null,
wr: null
};
И предложение № 2 (я не уверен в этом): попробуйте аннотировать тип конфигурации. Что-то вроде этого:
/** @type {{team: *, wr: *}} */
var config = {};
ИЛИ используя клон:
var config = goog.object.clone(setters);
goog.object.forEach(config, function(val, key) {
config[key] = val.call();
});