JS - linter 可以捕获类型错误吗?

JS - can a linter catch type errors?

让许多 Java 偷窥者对 JS 感到焦虑的似乎是它的 "cool dad" 性质;凌晨 2 点之前,您是否抽大麻或与朋友出去玩都无关紧要。没有那个结构,就不可能在 "compile time" 处检查类型安全......或者是吗?

当然,javascript 有类型,但不是强类型。也就是说,阅读以下摘录的人会注意到这将引发运行时异常:

function f(anArray) {
    "use strict";
    anArray.push("hi");
}
f(5); //runtime exception for sure

作为程序员,我们可以看到这一点,因为即使没有显式声明类型 (例如 int c;),我们也可以收集各种其他特征来推断其类型 (这是一个没有引号的数字)。似乎有一种算法(例如决策树)可以轻松推断给定对象的类型。

其实质是在动态类型语言中,类型是存在的,但是它们的使用和转换是隐式。那么我的问题是:

linter 是否可以使用隐式约定来确定方法的预期类型,并在 "lint time" 警告潜在的运行时错误?

提前致谢。

我建议你看一下 Tern,你可以将它安装到你的文本编辑器中(或者只是 运行 它作为可执行文件),它会尝试确定类型特定范围内的变量,并提供诸如代码完成、方法建议(基于确定的类型)、函数参数提示等工具。它并不完美,但基于 JavaScript 的限制工作得很好.

像 linters 或类型检查器这样的代码检查员只能 "that far" 分析代码以发现类型不兼容。

例如考虑这段代码:

function f(a) {
  return a%2 ? [a] : false;
}
x = [];
for (var i=1; i < 10; i+=2) {
  x = f(i).concat(x);
}
document.write(x);    

这不是问题;但如果 i 从 2 而不是 1 开始。一般来说,传递给 f 的值可能是复杂算法的结果,代码检查员实际上必须 运行 代码才能知道结果。这当然不是这种工具的想法,因此在实践中只能找到类型不兼容的微不足道的情况。