JavaScript静态类型检查的现状是什么?

19
我知道Google Closure Compiler进行类型检查,但是否有其他替代方法?最好不要与库和优化器紧密耦合。如果没有,请问是否有办法让Google Closure Compiler仅进行静态分析?在这里,静态分析指的是为参数定义类型等内容,我可以通过某些方式运行它,以便在出现拼写错误或传递错误类型时提供警告。

我认为你的方向是相反的。类型检查是编译器编译过程的一个特性。它的存在是为了促进编译,而不是真正意义上作为独立使用,因为它在很大程度上取决于编译器的功能。但是,您不需要使用Closure库来使用编译器。 - Stephen Chung
1
编译器做了什么,以至于你不能忽略输出文件? - John
@luxun,你的网站看起来很像我的。 - Engineer
我在重复John的评论。使用Closure-compiler进行SIMPLE_OPTIMIZATIONS和VERBOSE警告,并忽略输出文件。 - Chad Killingsworth
@StephenChung 类型检查的主要好处是尽早捕获基本错误。来自ML家族和衍生语言(OCaml,SML,F#,Haskell)的语言可以推断类型,即程序员不需要指定变量的类型。换句话说,编译器为程序员工作,而不是相反。 - Martin Jambon
显示剩余3条评论
3个回答

2

有一个名为Doctor JS的项目,它是Mozilla的一个项目,主要(至少据我所知)用于JS的类型检查。


这似乎很有用,尽管据我所见,没有直接从命令行运行它的方法(例如在构建/测试脚本内使用)。是否有这样的访问方式? - Aaron Yodaiken
我在我的一个脚本上尝试了一下,但它没有起作用 - 显示它没有工作。然后我在一个非常短的脚本上尝试了一下,它确实起作用了,所以我不知道它是否只是不能在较大的脚本上工作,还是有错误或其他问题。 - jfriend00
它可以在Github上获取,因此您可以尝试在本地安装和运行它。 - Tikhon Jelvis

0

我一直很喜欢Intellij Idea/WebStorm编辑器,它可以解析jsdoc并进行自己的静态分析以标记潜在或实际的类型安全错误。虽然需要一些工作才能使继承与一些常见框架配合使用,但它已经被证明非常有用。由于JavaScript原型继承有许多可能的方法,因此编译器需要比其他语言更多的帮助。

这是一个商业工具,但我能够将其用于Java、PHP、JavaScript、Python和Ruby项目,所有这些项目都有相当不错的静态分析和重构辅助工具。我曾经使用Emacs并运行Node.js进程进行JSHint和Closure Compiler,但这种方式要容易出错得多。


0

微软的AJAX Minifier对JS文件的预处理要求相对较少,可以使用默认设置运行并生成高度压缩的文件,同时仍然能够与外部代码兼容: http://ajaxmin.codeplex.com/

但是,由于Javascript的设计方式,Closure Compiler和Ajax Minifier都只能进行非常有限的静态分析,除了基本的语法检查之外。访问未声明的属性可能只是检查undefined,分配未声明的变量只意味着在全局范围内声明它,将对象分配给包含数字的变量是合法的等等。在JS中有很多在其他典型语言(如Java、C#)中被认为是超出界限的操作,因此如果没有为特定编译器声明类型、边界和期望,您所能防止的错误就会受到限制。

我更感兴趣的是能够在两种主流编译器(MS和Google)之间进行转换的工具。这对于IDE支持、测试带有高级优化的代码大小等方面都会非常有用。


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