在Google Closure中,如果初始化了特定Array
的{{1}},我可以确定Google Closure是否会确认数组内容?
这是一个小测试用例。在我看来,@type {Array.<type>}
正在偷偷通过{Array.<string>}
支票,但{Array.<number>}
被同一支票正确阻止了。我对GC有点新手,这对我来说是个错误吗?
我已将其粘贴到Google Closure Service,而我只显示了两个预期错误中的一个(2013年9月12日)。我已使用{string}
和ADVANCED_OPTIMIZATIONS
在我的本地jar文件(最新版本,v20130823)上对此进行了双重测试。它仍然看起来像warning_level VERBOSE
偷偷靠近。
文档:Annotating for Google Closure
提前感谢您的意见。
{Array.<string>}
注意: 我仔细研究了this related question,其中手动填充了Array.push()的类型。但这个问题涉及初始化。如果我采用他更正的代码并使用垃圾数据初始化他的所有数组,如上所述,GC也无法在他的情况下捕获垃圾。
已编辑已将// ==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);
和warning_level VERBOSE
添加到测试用例的标题中,以确定无疑。 language ECMASCRIPT5
仍未检测到。
答案 0 :(得分:4)
这是当前类型检查器的限制。右边有一边分别输入“Array
”(又名Array<?>
)而不是“Array<number>
”或“Array<string>
”,可以将其分配给任何类型。
对于这种特定情况,可以增强类型类型检查器,但由于事实数组在JavaScript中是可变的,因此在更复杂的情况下会很快崩溃。也就是说,如果将“[11]”键入Array<number>
,那么添加任何其他类型将是非法的,但数组通常不是同质的考虑:
var args = [];
args[0] = 1;
args[1] = 'foo';
因此,默认情况下,Array的类型不得限于初始类型。