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

Z.W*_*.W. 6 javascript google-closure-compiler jsdoc

在Google Closure中,如果初始化Array某个特定@type {Array.<type>}内容,我可以确定Google Closure是否会确认数组内容?

这是一个小测试用例.在我看来,一个人{Array.<string>}偷偷通过{Array.<number>}支票,虽然a {string}被同一支票正确阻止.我对GC有点新意,这是我的错误吗?

我已将此粘贴到Google Closure服务中,我只显示了两个预期错误中的一个(2013年9月12日).我双测试这对我的本地jar文件(最新,v20130823)与ADVANCED_OPTIMIZATIONSwarning_level VERBOSE.它仍然看起来像{Array.<string>}偷偷摸摸.

文档:为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);
Run Code Online (Sandbox Code Playgroud)

注意: 我仔细研究了这个相关的问题,其中Array.push()的类型是手动填写的.但这个问题涉及初始化.如果我采用他更正的代码并使用垃圾数据初始化他的所有数组,如上所述,GC也无法在他的情况下捕获垃圾.

编辑:添加warning_level VERBOSElanguage ECMASCRIPT5对测试用例的头,只是要确定.{Array.<string>}仍未检测到.

Joh*_*ohn 4

这是当前类型检查器的限制。右侧的 had 一侧分别键入为“ Array”(又名Array<?>)而不是“ Array<number>”或“ Array<string>”,允许分配给任何类型。

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

var args = [];
args[0] = 1;
args[1] = 'foo';
Run Code Online (Sandbox Code Playgroud)

所以Array的类型默认不能限制为initial类型。