【问题标题】:Closure Compiler does not always enforce type safety?闭包编译器并不总是强制类型安全?
【发布时间】:2013-11-05 05:41:09
【问题描述】:

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

/**
 *  @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);

【问题讨论】:

    标签: javascript google-closure-compiler jsdoc


    【解决方案1】:

    出现两个问题:

    1. 闭包编译器 Web 服务以“演示”模式运行,并假定所有未声明的变量都是外部变量。目前没有办法禁用此功能。使用命令行编译器进行测试不会显示相同的问题。

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

    【讨论】:

    • 是的,颠倒声明可以解决问题。否则,“类型”仅被视为参数的注释:@param {number} x
    • 谢谢大家。非常感激。有趣的是,如果您错误地命名它,编译器会抛出 x 不存在的警告,但也会在不正确的位置发出警告。我会记录一个错误。
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2018-08-26
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多