Closure Compiler并不总是强制类型安全?

时间:2013-10-25 23:46:50

标签: javascript google-closure-compiler jsdoc

我遇到了关闭编译器的问题,因为某些奇怪的原因它没有强制执行严格的类型检查。它在设置声明的变量时正确检查类型安全性,但在传递对象时未能抛出类型错误。

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

    this.var1 = x;

};

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

为什么闭包编译器不强制执行类型安全?如果我声明变量,它正确地起作用:

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

1 个答案:

答案 0 :(得分:2)

发生了两个问题:

  1. Closure-compiler Web服务以" demo"模式并假设所有未声明的变量都是外部的。目前无法禁用此功能。使用命令行编译器进行测试不会显示相同的问题。

  2. 您的JSDoc参数注释不正确。它应该是@param {number} x(您的类型和名称已颠倒过来)。