使用Closure-Compiler键入检查数组内容

时间:2013-09-12 11:09:38

标签: javascript google-closure-compiler jsdoc

在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仍未检测到。

1 个答案:

答案 0 :(得分:4)

这是当前类型检查器的限制。右边有一边分别输入“Array”(又名Array<?>)而不是“Array<number>”或“Array<string>”,可以将其分配给任何类型。

对于这种特定情况,可以增强类型类型检查器,但由于事实数组在JavaScript中是可变的,因此在更复杂的情况下会很快崩溃。也就是说,如果将“[11]”键入Array<number>,那么添加任何其他类型将是非法的,但数组通常不是同质的考虑:

var args = [];
args[0] = 1;
args[1] = 'foo';

因此,默认情况下,Array的类型不得限于初始类型。