Google Closure Compiler 100%打字

时间:2010-11-19 23:33:38

标签: javascript typing google-closure-compiler jsdoc

如何让我的应用程序在谷歌闭包编译器方面100%打字?

我已经使用jsdoc评论标记了所有内容。甚至可以获得100?我是64.6%

4 个答案:

答案 0 :(得分:15)

有可能达到100%。我自己的项目是100%打字的。闭包编译器可以输出有关未知类型的表达式的警告。遗憾的是,没有命令行选项来启用此功能。您必须修改源代码才能启用它:

  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.jar现在位于构建目录中。

  4. 当您在脚本上使用此修改后的编译器时,它会针对编译器无法确定类型的所有表达式发出大量警告。当您在代码中修复所有这些警告时,它将100%键入。

答案 1 :(得分:9)

编译器有一个标志,您可以设置该标志以使未知类型输出警告。

--jscomp_warning=reportUnknownTypes

您还需要提高警告级别。

--warning_level=VERBOSE

答案 2 :(得分: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

似乎封闭库本身并非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%。只需根据需要进行尽可能多的输入,以使您熟悉自己的代码。

答案 3 :(得分: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

  4. 编译代码

    但请注意,tightenTypes是实验性的并且相当破碎。