欢迎!请参阅关于页面以了解更多有关此操作的信息。
关于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推断的提示,因此它不会影响此情况中的警告。它应该是只包含和不包含js命名空间的 ^number
^js/number
js/
^number
请注意,ocall 是一个宏,因此是否将您提供的元数据应用于源形式以生成输出形式取决于该宏。因此,它可能根本不会到达编译器需要它的地方。
ocall
另外,考虑只使用 (js/Math.random) 而不是 ocall。这是安全的,就像所有标准函数一样避免重命名。这还将正确地保留类型提示。
(js/Math.random)