在Google Closure中,如果初始化一个特定的Array
的@type {Array.<type>}
,我能确定Google Closure会确认数组内容吗?
这是一个小测试用例。在我看来,{Array.<string>}
正在偷偷通过 {Array.<number>}
检查,尽管 {string}
被相同的检查正确阻止。我对 GC 有点陌生,这是我的错误吗?
我已将其粘贴到 Google Closure Service ,并且我只显示了两个预期错误之一(2013 年 9 月 12 日)。我已经在我的本地 jar 文件(最新的 v20130823)上用 ADVANCED_OPTIMIZATIONS
和 warning_level VERBOSE
对这个进行了双重测试。它看起来仍然像 {Array.<string>}
偷偷溜过。
文档:Annotating for Google Closure
预先感谢您的输入。
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @warning_level VERBOSE
// @language ECMASCRIPT5
// ==/ClosureCompiler==
/**
no warning, as expected:
@type {Array.<number>}
*/
var a = [1,2,3,4];
/**
warning! Type mismatch as expected:
@type {Array.<number>}
*/
var b = 'mismatch'; // {string} does not match {Array.<number>}
/**
no warning, but Type mismatch was expected:
@type {Array.<number>}
*/
var c = ['foo','bar']; // {Array.<string>} should not match {Array.<number>}
// prevent compile-to-zero
alert(a);
alert(b);
alert(c);
注意: 我仔细查看了 this related question ,其中手动填充了 Array.push() 的类型。不过,这个问题与初始化有关。如果我采用他更正的代码并用垃圾数据初始化他的所有数组,如上所述,GC 也无法在他的情况下捕获垃圾。
已编辑:将 warning_level VERBOSE
和 language ECMASCRIPT5
添加到测试用例的 header 中,以确保万无一失。 {Array.<string>}
仍未检测到。
最佳答案
这是当前类型检查器的一个限制。右侧的类型分别为“Array
”(又名 Array<?>
)而不是“Array<number>
” 或“Array<string>
”,允许分配给任何类型。
可以针对这种特定情况增强类型检查器,但由于数组在 JavaScript 中是可变的,因此在更复杂的情况下它很快就会崩溃。也就是说,如果将“[11]”键入 Array<number>
然后添加任何其他类型将是非法的,但数组通常不是同质的考虑:
var args = [];
args[0] = 1;
args[1] = 'foo';
所以Array的类型一定不能默认限制为初始类型。
关于javascript - 使用 Closure-Compiler 类型检查数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762608/