2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面以了解更多有关此功能的信息。

0 投票
ClojureScript

core.cljs 中实现 pr-writer-impl 时,代码首先检查对象是否使用 deftypedefrecord 创建。它是通过检查 cljs$lang$type 属性来实现的。

ECMAScript 6 引入了 代理 对象,允许创建可以拦截任意属性查找的对象。有些现代 JavaScript 库(例如,Pulumi)利用此功能作为其 API 的一部分,并返回任意属性查找的“真”值。

这会导致在 ClojureScript 中打印这些对象时发生代码错误,包括在 REPL 中,当处理此类库生成的对象时,使 REPL 在很大程度上变得不可用。

在一般情况下,无法通过客户端代码绕过这种限制,因为检查是在检查其他协议(如 IPrintWithWriter)之前发生的。

建议的修复方案:而不是仅测试 cljs$lang$type 属性的“真”性,测试特定的值或值类型,使得条件对于响应任意属性查找以任意值的方式的 Proxy 对象不会求值为真。

1 答案

+1 投票

协议已经使用了 cljs.core/PROTOCOL_SENTINEL 对象。我觉得这个 cljs$lang$type 属性也可以用那个来代替 true

...