欢迎!想了解更多关于这个功能的信息,请查看关于页面。
关于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推断的提示,因此不会影响此处的警告。它应该是没有js命名空间的^number。
^js/number
js/
^number
此外,请注意,ocall是一个宏,是否将其元数据应用到源形式到输出形式取决于该宏。因此,它可能实际上不会到达需要的地方的编译器。
ocall
还可以考虑仅使用(js/Math.random)而不是ocall。这样就像所有标准函数一样,可以安全地从重命名环境中分离出来。这也会正确地保存类型提示。
(js/Math.random)