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 = {}; 

ИЛИ с использованием клона:

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

Спасибо. Дело в том, что config имеет более 75 свойств, и использование первого метода будет громоздким. То же самое относится ко второму – sbr

+0

Как насчет 'config ['team']' подхода? – Tony

+0

Или 'клон'. См. Мой обновленный ответ. – 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. 

 Смежные вопросы

  • Нет связанных вопросов^_^