在谷歌闭包中,如果Array一个特定@type {Array.<type>}的被初始化,我可以确定谷歌闭包会确认数组内容吗?
这是一个小测试用例。在我看来,an{Array.<string>}正在偷偷溜过{Array.<number>}支票,尽管 a{string}被同一张支票正确阻止了。我对 GC 有点陌生,这是我的错误吗?
我已将此粘贴到Google Closure Service,并且我只显示了两个预期错误之一(2013 年 9 月 12 日)。我已经在我的本地 jar 文件(最新,v20130823)上使用ADVANCED_OPTIMIZATIONS和warning_level VERBOSE. 它仍然看起来像{Array.<string>}偷偷溜过去。
提前感谢您的意见。
// ==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);
注意: 我仔细查看了这个相关的问题,其中 Array.push() 的类型是手动填写的。不过,这个问题涉及初始化。如果我采用他更正的代码并用垃圾数据初始化他的所有数组,如上所述,GC 也无法在他的情况下捕获垃圾。
编辑:添加warning_level VERBOSE和language ECMASCRIPT5到测试用例的标题中,只是为了确定。{Array.<string>}仍然没有被检测到。