其实不然,并不是完全这样。kondo的静态类型检查系统有点像拼凑起来的。例如,每次它需要进行条件类型检查时,都必须插入一个自定义函数。
kondo为core.into定义了一个自定义函数,指定返回类型与作为其第一个参数传入的集合的类型相同。已经在他们的JIRA板上有一个问题单要添加到另一个函数,而且它也不适用于各种其他函数,比如inc函数。如果你向inc传递一个int,kondo就不知道输出是否仍然是int。
IE.
此代码:(nth [1 2 3] 1.5) 在 kondo 中引发错误(不过,实际上 nth 可以用于非整数)
但这段代码 (nth [1 2 3] (inc 0.5)) 会正常执行,没有错误。
如果这种情况持续下去,kondo 将不得不拥有大量逻辑,而这些逻辑并不一定属于他们的代码库。
如果用户想要实现或扩展此类逻辑,这将很困难。没有简单且易于理解的方法来定义它。我原本希望 spec 能够成长并通过 TypeScript 方式的开发者在自己的代码库中编码必要类型逻辑成为一种标准方式。例如,如果您的代码库中需要一个 int 的集合,或者需要一个针对数据库的某种自定义类型的集合,kondo 就会将这些信息传达出去,并能够在这上面执行逻辑,并在执行过程中发现潜在的错误。
我不确定进行这种类型分析的适当逻辑是否应该位于 kondo 中,或者是否应该位于 clojure 代码库中某处,因为它完全依赖于 clojure 的 API。我也不知道 spec 或 spec2 是否是存放它的合适位置。这就是为什么我提出这个问题。