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();
});