其实并没有,完全不行。kondo的类型检查系统有点拼凑。例如,每次需要进行条件类型检查时,它都必须放置一个自定义函数。
当调用 core.into 时,Kondo 使用一个自定义函数来确保返回类型与作为第一个参数传入的集合类型相同。目前已经在他们的 JIRA 票据板上创建了一个任务,计划将其添加到另一个函数中。然而,这种方法并没有应用于包括 inc 函数在内的许多其他函数。例如,如果你向 inc 函数传入一个 int,Kondo 将无法确定输出是否仍然是 int。
也就是说
以下代码:(nth [1 2 3] 1.5) 在 kondo 中引发错误(但实际上 nth 函数是针对非整数定义的)。
但以下代码 (nth [1 2 3] (inc 0.5)) 执行时没有发生错误。
如果这种情况继续下去,Kondo 将不得不包含大量的逻辑,而这些逻辑并不一定属于其代码库。
如果用户希望实现或扩展这种逻辑,将非常困难。目前尚未有一种简单且易于理解的方法来定义它。我原本希望 spec 能够发展成为一个标准,让开发者能够在 TypeScript 风格下在各自的代码库中编码必要的数据类型逻辑。例如,如果在一个代码库中定义的集合是一个整数的集合,或者针对数据库的某种自定义类型集合,这样的信息将被传达给 Kondo,并能够对其进行逻辑处理。如果后续步骤中有任何错误发生,它也能够预知。Spec 和 Malli 已经具备一些完成这一过程的系统,但 Kondo 缺乏实现这一目的所需的逻辑。
我不确定这种分析的正确逻辑应属于 Kondo 本身,还是应在 Clojure 代码库的某处实现,因为它完全依赖于 Clojure 的 API。我也不确定 spec 或 spec2 是否是存放它的适当位置。这就是为什么我在这里提出这个问题的原因。