欢迎!请参阅关于页面以获取更多有关该服务如何工作的信息。
关于在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推断的提示,因此不会影响此情况中的警告。它应该只以 ^number 的方式书写,而不需要 js 命名空间。
^js/number
js/
^number
此外,请注意 ocall 是一个宏,因此它是否将您提供的元数据应用于源形式到输出形式取决于该宏。因此,它可能实际上并未到达需要它的编译器位置。
ocall
此外,考虑仅使用 (js/Math.random) 而不是 ocall。这将像所有标准函数一样安全地从重命名中出来。这也将正确保留类型提示。
(js/Math.random)