谷歌闭包编译器100%类型化

11

如何让我的应用程序在Google Closure编译器中达到100%的类型化?

我已经使用JSdoc注释标记了所有内容。是否可能实现100%的类型化?目前仅为64.6%。


你是否尝试过编译Closure库本身?它是否能够完美编译? - Jan
2
你是如何确定“64,6%”的? - huyz
2
这是命令行中所写的内容 ;) 闭包编译器如何确定,我不知道...也许是每个变量的类型变量?但可能更加复杂。 - Sven Hecht
@huyz summary_detail_level 3,如果您想在输出中看到它。 - sbr
4个回答

16

实现100%类型检查是可能的。我的项目已经实现了100%的类型检查。闭包(Compiler)可以输出关于未知类型表达式的警告,但不幸的是没有命令行选项来启用此功能。您需要修改源代码才能启用它:

  1. 下载当前源代码:

    git clone https://code.google.com/p/closure-compiler/

  2. 编辑src/com/google/javascript/jscomp/CompilerOptions.java文件,将reportUnknownTypes = CheckLevel.OFF改为reportUnknownTypes = CheckLevel.WARNING

  3. 在根目录中通过简单调用ant编译闭包(Compiler)。修改后的compiler.jar现已在build目录中。

当您在脚本上使用这个修改后的compiler时,它会输出大量的警告信息,提示出现了编译器无法确定类型的表达式。当您修复代码中所有这些警告时,就可以实现100%的类型检查了。


由于Sven没有对这个问题发表评论,我想说“非常感谢,它有效!”哦,还有+1 :) - Camilo Martin
谢谢!仅供跟进此线程的人,编译器现在已经转移到了 git。请通过 git clone https://code.google.com/p/closure-compiler/ 替换第1步。 - Mad Echet
10
今天可以通过命令行使用--jscomp_warning=reportUnknownTypes来实现。 - David Rodrigues
看起来第二步已经改变了。这个对我有用:options.setWarningLevel(DiagnosticGroup.REPORT_UNKNOWN_TYPES, CheckLevel.WARNING) - ɲeuroburɳ

9
编译器有一个标志可以设置,使未知类型输出警告信息。
--jscomp_warning=reportUnknownTypes

您还需要提高警告级别。

--warning_level=VERBOSE

5

我尝试编译goog.net.XhrIo进行测试:

goog.require('goog.Uri.QueryData');
goog.require('goog.debug.ErrorHandler');
goog.require('goog.net.XhrIo');

goog.net.XhrIo;

当我编译时,会得到以下结果:
20-nov-2010 1:12:21 com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 0 error(s), 1 warning(s), 91,5% typed
JSC_USELESS_CODE. Suspicious code. This code lacks side-effects. Is there a bug? at test.js line 5 : 0

似乎Closure库本身并不是100%类型化的,我认为目标也不是达到100%。Javascript不是静态类型语言。Closure试图将一些静态类型语言的好处带入javascript中,这是好的。但这并不意味着您必须承担这种类型语言的负担。
编辑:我尝试编译一个空文件,结果是90.4%。我认为这意味着所有原始函数的base.js并没有100%的类型。所以我进行了更多实验,并发现当我在所有本地变量上也放置了类型信息时,百分比会增加。我认为没有必要在所有本地变量上放置类型信息。想象一下:
/** @type {number} */
var i = 0;
for(i = 0; i < 10; i++) {
  // do something
}

使用闭包编译器进行编译,这并不是我们的目标。这一事实可以通过编译base.js并没有达到100%得到证明。在开发过程中,我尝试将此数字保持在85%至95%之间。当然,根据你的时间、编程风格和应用程序的不同,这个数字可能会有所变化。最好的指导原则是,在应用程序的开发过程中尽量保持百分比稳定,无论是60%还是90%。只需输入足够的代码即可使自己对代码感到舒适。


1
你的示例即使没有 @type 注释也是 100% 类型化的。编译器可以从变量的使用中确定类型。因此,将数字分配给变量的第一个赋值声明了类型为 {number} 的变量。如果你的编译器没有达到 100%,那么请尝试更新版本。 - kayahr

0

所有的功劳归于@kayahr,但由于时间的推移,我想对他的答案进行更新,因为它是基于旧版本的编译器。

您需要重新编译源代码并强制执行类型检查。操作步骤如下:

  1. 下载源代码 git clone https://code.google.com/p/closure-compiler/ 并进入 closure-compiler 目录

  2. 编辑 src/com/google/javascript/jscomp/CompilerOptions.java 文件,并将 checkTypes 设置为 true。您还可以尝试各种编译和优化变量。

  3. 运行 ant 命令编译代码

请注意,tightenTypes 是实验性的且存在一些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接