欢迎!请查阅关于页面以了解更多关于本站的功能信息。
继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)