在 core.cljs
中实现 pr-writer-impl
时,代码首先检查对象是否使用 deftype
或 defrecord
创建。它是通过检查 cljs$lang$type
属性来实现的。
ECMAScript 6 引入了 代理 对象,允许创建可以拦截任意属性查找的对象。有些现代 JavaScript 库(例如,Pulumi)利用此功能作为其 API 的一部分,并返回任意属性查找的“真”值。
这会导致在 ClojureScript 中打印这些对象时发生代码错误,包括在 REPL 中,当处理此类库生成的对象时,使 REPL 在很大程度上变得不可用。
在一般情况下,无法通过客户端代码绕过这种限制,因为检查是在检查其他协议(如 IPrintWithWriter
)之前发生的。
建议的修复方案:而不是仅测试 cljs$lang$type
属性的“真”性,测试特定的值或值类型,使得条件对于响应任意属性查找以任意值的方式的 Proxy
对象不会求值为真。