欢迎!有关如何使用本站的信息,请参阅关于页面。
启用高级编译后,具有键 "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值(无需协议检查)并使用它。
seq?
coll?
好吧,我猜测是这样的。我考虑过移除前三个案例,或者只是交换js和协议检查的顺序,但我不确定这可能会引入什么类型的破坏。如果我们只是在我们自己的json解析器中使用修改后的版本,应该没问题吧?看起来那些协议检查只有在你clojure和数据json混用的时候才有用。
cljs_deps.js