gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:48:28 24 4
gpt4 key购买 nike

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

/**
* @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. Closure-compiler 网络服务以一种“演示”模式运行,并假定所有未声明的变量都是外部变量。目前没有办法禁用它。使用命令行编译器进行测试未显示相同的问题。

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

关于javascript - Closure Compiler 并不总是强制类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19601110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com