欢迎!请参阅关于页面,了解有关此工作方式的更多信息。
启用高级编译后,带有键 "v" 的 JS 对象会导致 (seq? x) 语句中的 js-→clj 返回 true,但由于 js/Object 不满足 ISeqable,下一行的 map 会导致错误。我在 circleci 前端代码库中发现了这个问题。我现在正在创建一个最小化项目测试用例。
(seq? x)
js-→clj
ISeqable
map
由 iandavis 补充的评论
无法生成最小案例。它确实在我们的存储库中失败,但不能让它在一个更简单的例子中失败。将此问题保持开放状态,以便任何其他人遇到此问题,但在没有其他报告的情况下,不要期待跟踪跟进。
由 dnolen 补充的评论
我认为托马斯的分析在这里是正确的。我认为在js->clj中使用seq?和coll?检查可能考虑不周,但改变这一点可能会为不同用户群体引入不同类型的破坏。你可以提供JS对象及其属性的externs文件(我知道如果动态将很难做),或者写一个更简单的自定义js->clj,它只期望JS值(没有协议检查),然后使用它。
js->clj
seq?
coll?
好了,我想这可能是那样的。我考虑过删除前三个情况,或者只是颠倒js和协议检查的顺序,但我并不完全确定那可能会引入什么样的破坏。如果我们只是在我们的json解析器中使用修改后的版本,应该没问题,是吗?看起来那些协议检查只有在你有clojure与json混合时才有用。