Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包编译器并不总是强制类型安全?_Javascript_Google Closure Compiler_Jsdoc - Fatal编程技术网

Javascript 闭包编译器并不总是强制类型安全?

Javascript 闭包编译器并不总是强制类型安全?,javascript,google-closure-compiler,jsdoc,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

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

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

出现了两个问题:

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

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


  • 是的,撤销声明解决了这个问题。否则,“type”只被看作是param:@param{number}xThanks的注释。非常感谢。有趣的是,如果命名不正确,编译器会发出警告说x不存在,但也会出现在不正确的位置。我将记录一个bug。