2013-10-25 2 views
1

일부 이상한 이유로 엄격한 유형 검사를 시행하지 않는 클로저 컴파일러에 문제가 있습니다. 선언 된 변수를 설정할 때 유형 안전성을 올바르게 확인하지만 객체를 전달할 때 유형 오류가 발생하지 않습니다.클로저 컴파일러가 항상 유형 안전을 적용하지 않습니다?

/** 
* @public 
* @param x {number} 
*/ 
SomeClass.prototype.setterMethod = function(x) { 

    this.var1 = x; 

}; 

var a = new SomeClass(); 
a.setterMethod({}); // SHOULD THROW AN ERROR!!!!!! 

여기서 클로저 컴파일러가 유형 안전을 적용하지 않는 이유는 무엇입니까? 올바르게 I 변수를 선언하면 함수 :

this.var1 = {}; // correctly throws an error 

멤버 선언의 외측 반원 변수를 설정할 때이 함수 파라미터에 엄격한 타입의 안전 검사를 수행하거나되지 그러나. 아래에 전체 코드와 출력을 게시했습니다. 이러한 유형의 수표를 강제로 종결 할 수있는 방법이 있습니까? 아니면 여기서 뭔가 잘못하고있는 걸까요?

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @warning_level VERBOSE 
// @output_file_name default.js 
// ==/ClosureCompiler== 

/** 
* @class SomeClass 
* @constructor 
*/ 
function SomeClass() { 

    /** 
    * @protected 
    * @type {number} 
    */ 
    this.var1; 

}; 

/** 
* @public 
* @param x {number} 
*/ 
SomeClass.prototype.setterMethod = function(x) { 
    this.var1 = x; 
}; 

/** 
* @public 
* @returns {number} 
*/ 
SomeClass.prototype.getterMethod = function() { 
    return this.var1; 
}; 

/** 
* @type {SomeClass} 
*/ 
var a = new SomeClass(); 
a.setterMethod({}); 
console.log(a.getterMethod()); 

// output: -- NO WARNINGS!!!! 
// var a=new function(){};a.a={};console.log(a.a); 

답변

2

이 발생하는 두 가지 문제입니다 : "데모"모드의 유형에

  1. 클로저 컴파일러 웹 서비스가 실행되고 모든 선언되지 않은 변수는 외부 가정합니다. 현재이 기능을 사용 중지 할 방법이 없습니다. 명령 줄 컴파일러로 테스트해도 동일한 문제가 표시되지 않습니다.

  2. JSDoc 매개 변수 주석이 올바르지 않습니다. @param {number} x이어야합니다 (유형 및 이름의 반대가 있음).

+1

예, 신고를 취소하면 문제가 해결됩니다. 그렇지 않으면 "형식"은 단순히 매개 변수에 대한 주석으로 간주됩니다. @param {number} x – John

+0

감사합니다. 매우 감사. 재미 있기 때문에 컴파일러는 경고를 throw합니다 x는 존재하지 않는 이름을 잘못하면, 또한 잘못된 지점입니다. 나는 벌레를 기록 할 것이다. – ansiart

관련 문제