JS - linter捕获类型错误?

时间:2016-04-24 21:14:37

标签: javascript types lint

似乎令许多Java人士对JS感到焦虑的是它的“酷爸爸”性质;它不关心你是否抽烟或与你的朋友一起出去,直到凌晨2点。如果没有这种结构,就无法在“编译时”检查类型安全性......或者是它?

当然,javascript有类型,但它没有强类型。话虽如此,阅读以下摘录的人会注意到这将引发运行时异常:

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

我们可以将其视为程序员,因为即使类型未明确声明(例如int c;),我们也可以收集各种其他特征来推断其类型(它是一个数字)没有引号)。似乎有一种算法(例如决策树)可以很容易地推断出给定对象的类型。

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

像链接器或类型检查器这样的代码检查员只能在分析代码时“走得那么远”才能发现类型不兼容。

考虑这个代码:

def percolateDown(currNode: Node): Unit = {
    val maxChild = if (currNode.left.value > currNode.right.value) currNode.left else currNode.right

    if (currNode.value < maxChild.value) {
        val tempValue = currNode.value
        currNode.value = maxChild.value
        maxChild.value = tempValue

        percolateDown(maxChild)
    }
}

percolateDown(root)

这不是问题;但是如果 i 从2开始而不是1开始就会出现。通常,传递给 f 的值可能是复杂算法的结果,而代码检查员会必须实际运行代码才能知道结果。这当然不是这种工具的概念,因此在实践中只能找到类型不兼容的琐碎案例。

相关问题