欢迎!请参阅关于页面了解更多关于如何使用此工具的信息。
关于 Slack 中 ClojureScript 主题的最近讨论,Dan Sutton 建议我在这里创建一个问题。
我认为我可能发现了 ClojureScript 类型推断中的一个错误。我在这里创建了一个最小的复制品
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 推断的提示,因此不会影响此情况中的警告。它应该是没有 js 命名空间的^number。
^js/number
js/
^number
另外,请注意,ocall 是一个宏,因此它是否将您提供的元数据应用于源形式的输出形式由该宏决定。因此,它可能实际上没有到达需要的地方。
ocall
此外,考虑使用 (js/Math.random) 而不是 ocall。这像所有标准函数一样安全,同时也能正确地保留类型提示。
(js/Math.random)