6

在谷歌闭包中,如果Array一个特定@type {Array.<type>}的被初始化,我可以确定谷歌闭包会确认数组内容吗?

这是一个小测试用例。在我看来,an{Array.<string>}正在偷偷溜过{Array.<number>}支票,尽管 a{string}被同一张支票正确阻止了。我对 GC 有点陌生,这是我的错误吗?

我已将此粘贴到Google Closure Service,并且我只显示了两个预期错误之一(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);

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

编辑:添加warning_level VERBOSElanguage ECMASCRIPT5到测试用例的标题中,只是为了确定。{Array.<string>}仍然没有被检测到。

4

1 回答 1

4

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

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

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

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

于 2013-09-15T22:15:37.753 回答