javascript中的Typesafety或如何避免很难检测到的类型相关错误

javascript中的Typesafety或如何避免很难检测到的类型相关错误,javascript,Javascript,我来自Java世界,也就是一个类型安全的世界,现在正在做一些事情,需要使用javascript在客户端执行 由于JS的非类型化,我经常遇到很难检测到的错误,我想知道是否有任何方法可以事先防止它。例如,设置诸如“使用类型化”之类的内容,或者通过某种工具在执行之前像编译器那样进行这些检查 上次是我在three.js中创建人脸时。取决于顶点的顺序,面是否正面。我混合了这一点,然后复制粘贴的参数,在这种情况下,我也复制了一个括号太多,结果它在错误的位置,只调用了一个而不是三个顶点的方法,这当然会导致错误

我来自Java世界,也就是一个类型安全的世界,现在正在做一些事情,需要使用javascript在客户端执行

由于JS的非类型化,我经常遇到很难检测到的错误,我想知道是否有任何方法可以事先防止它。例如,设置诸如“使用类型化”之类的内容,或者通过某种工具在执行之前像编译器那样进行这些检查

上次是我在three.js中创建人脸时。取决于顶点的顺序,面是否正面。我混合了这一点,然后复制粘贴的参数,在这种情况下,我也复制了一个括号太多,结果它在错误的位置,只调用了一个而不是三个顶点的方法,这当然会导致错误。然而,在three.js代码的第2107行中,我们花了一些时间来解决这个复制粘贴问题。与java相比,编译器会直接抱怨我试图用1而不是3个参数调用该方法

希望有类似的东西。或者你有一些技巧如何更快地发现这些东西吗

干杯
Tom

在实际使用javascript文件之前,您可以使用各种linting工具扫描javascript文件。业界流行的有JSLint、JSHint、JSCS和ESLint

它们内置了各种规则集,您可以配置这些规则集,还可以添加自己的规则


您可以将这些与JAVA世界的checkstyles和PMD进行比较。

您有很多答案。但首先,需要澄清:Java不是类型安全的(请参阅:
NullPointerException
,Java的历史)

但是,为了更接近任何动态语言中的类型安全性,您可以选择在代码中添加断言。这在某种程度上是自动化的,可能会导致性能问题。这是我的路线,但我肯定不会使用three.js

特别是对于JavaScript,您有两个附加选项:和


TypeScript是JavaScript的一种方言,带有类型注释,可以编译成简单的JS。Flow是一个用OCaml编写的静态分析器,它试图推断JS代码中的类型并进行检查。

考虑到您的问题,这对您来说是相当大的帮助。-它几乎迫使您以更明确的方式编写代码,设置类型,并在访问当前范围中不存在的成员时对您大喊大叫。再加上一个好的文本编辑器,如VSCode或Atom等,您可以让intellisense像Java这样的语言一样工作。它还为Three.js提供了一个类型定义文件,这在您的情况下是一个额外的好处-绝对是个人推荐的。代码总是比文字好。您可能需要在问题中添加一些代码来澄清您的问题。
“编译器会直接抱怨我尝试使用1而不是3个参数调用该方法”
-我认为
somethod(apaparameter)
somethod(apaparameter,另一个参数,aThirdParameter)之间的区别
在上下文中是显而易见的。如果
someMethod
操作需要超过1个输入,并且只提供了1个,那么这应该会成为一个问题。我怀疑问题的一部分在于,您正在编写的代码一开始并不清楚,您依赖编译器来告诉您代码本身应该告诉您什么。@Tresdin我认为OPs问题更具概念性,因为他们喜欢依赖严格的环境,而Javascript在一些问题上却悄无声息地消失在角落里。“他们当前的代码库不是一个直接的问题。”David Great point。试图在不清楚语言工作原理的情况下使用javascript,并期望它/强迫它像java或其他任何语言一样工作,这通常是一个坏主意。Javascript有各种各样的方法使用typeOf、==等进行类型检查,还有许多工具(例如typescript)用于在更“类型安全”的环境中编写。使用你可以使用的,但也请,请花时间学习语言的语义/语法/语法。