欢迎!请查阅关于页面以了解该网站如何运作的相关更多信息。
在Slack的ClojureScript主题中最近的讨论之后,Dan Sutton建议我在这里创建一个issue。
我认为我可能在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命名空间。
^js/number
js/
^number
此外,需要注意的是ocall是一个宏,是否将提供的元数据应用到源形式到输出形式取决于该宏。因此,它可能实际上并没有到达需要的地方。
ocall
此外,考虑使用像(js/Math.random)这样的标准函数而不仅仅是ocall。这是安全的,就像所有标准函数一样。这样也会正确保留类型提示。