javascript - 使用 Closure-Compiler 类型检查数组内容

标签 javascript google-closure-compiler jsdoc

在Google Closure中,如果初始化一个特定的Array@type {Array.<type>},我能确定Google Closure会确认数组内容吗?

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

我已将其粘贴到 Google Closure Service ,并且我只显示了两个预期错误之一(2013 年 9 月 12 日)。我已经在我的本地 jar 文件(最新的 v20130823)上用 ADVANCED_OPTIMIZATIONSwarning_level VERBOSE 对这个进行了双重测试。它看起来仍然像 {Array.<string>} 偷偷溜过。

文档:Annotating for 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);

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

已编辑:将 warning_level VERBOSElanguage ECMASCRIPT5 添加到测试用例的 header 中,以确保万无一失。 {Array.<string>} 仍未检测到。

最佳答案

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

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

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

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

关于javascript - 使用 Closure-Compiler 类型检查数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762608/

相关文章:

javascript - PIXI.js 的 Closure Compiler EXTERNS - 自定义对象参数注释

javascript - JS Doc可以生成PDF吗

visual-studio-2012 - 来自 Typescript jsdoc 的 Visual Studio intellisense 不适用于胖箭头功能

javascript - 了解闭包编译器警告

javascript - 使用closure-compiler自动编译javascript源代码

javascript - AngularJS:使用过滤器将数组拆分为数组

javascript - ms-appdata 方案在 UWP WebView 中触发 UnsupportedUriSchemeIdentified

javascript - ":optimizations :advanced"的全局变量/函数过多

javascript - 通过js设置页面历史记录和页面内容

javascript - jQuery AJAX 和 XML 获取节点值