일부 이상한 이유로 엄격한 유형 검사를 시행하지 않는 클로저 컴파일러에 문제가 있습니다. 선언 된 변수를 설정할 때 유형 안전성을 올바르게 확인하지만 객체를 전달할 때 유형 오류가 발생하지 않습니다.클로저 컴파일러가 항상 유형 안전을 적용하지 않습니다?
/**
* @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);
예, 신고를 취소하면 문제가 해결됩니다. 그렇지 않으면 "형식"은 단순히 매개 변수에 대한 주석으로 간주됩니다. @param {number} x – John
감사합니다. 매우 감사. 재미 있기 때문에 컴파일러는 경고를 throw합니다 x는 존재하지 않는 이름을 잘못하면, 또한 잘못된 지점입니다. 나는 벌레를 기록 할 것이다. – ansiart