1

Google 클로저 컴파일러 고급 모드를 통해 다음 코드를 실행할 때 발생하는 경고를 제거하려면 어떻게해야합니까? 경고Google 클로저 컴파일러, 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

난 당신이 null 값이 속성을 정의해야한다, 그래서 컴파일러는 그것에 대해 알 것 같아요.

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

감사합니다. 문제는 설정에 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.