欢迎!请参阅关于页面了解此工作原理的相关信息。
关于 Slack 中 ClojureScript 主题的最近一次对话,Dan Sutton 建议我在这里创建一个问题。
我认为我可能在 ClojureScript 的类型推断中找到了一个 bug。我在这里创建了一个最小化的复现
https://github.com/paulbutcher/clojurescript-type-inference-bug
以下代码生成了一个警告
cljs.core/-, all arguments must be numbers, got [#{js/clj-nil clj-nil} #{js/clj-nil clj-nil}] instead (- (ocall js/Math :random) (ocall js/Math :random)) ^---
我预计可以这样修复它
(- ^js/number (ocall js/Math :random) ^js/number (ocall js/Math :random))
但它给了我完全相同的错误。
^js/number 不是一个有效的数字提示。任何以 js/ 开头的或都被视为 externs 推断的提示,因此它不会影响此情况下的警告。应该只使用 ^number 而不包含 js ns。
^js/number
js/
^number
此外,请注意 ocall 是一个宏,是否将您提供的元数据应用到源形式并传递到输出形式取决于该宏。因此,它可能实际上并没有到达编译器需要的位置。
ocall
还可以考虑仅使用 (js/Math.random) 而不是 ocall。这与所有标准函数一样,免于重命名。这将正确保留类型提示。
(js/Math.random)