在 core.cljs
中实现 pr-writer-impl
时,代码检查的第一个可能性是对象是否是用 deftype
或 defrecord
创建的。它是通过检查 cljs$lang$type
属性来实现的。
ECMAScript 6 引入了 Proxy 对象,允许构建可以拦截任意属性查找的对象。一些现代 JavaScript 库(例如,Pulumi)利用此功能作为其 API 的部分,并对于 任何 属性查找都返回 "truthy" 值。
这会导致在 ClojureScript 中打印这些对象时出现代码错误,包括在 REPL 中,并且在处理这些库生成的对象时使 REPL 几乎无法使用。
在一般情况下,不可能通过客户端代码来绕过这种限制,因为检查是在检查诸如 IPrintWithWriter
这样的替代协议之前进行的。
建议的修复方案:而不是仅测试 cljs$lang$type
属性的 "truthiness",测试一个特定值或值的类型,这样条件就不会对响应任意属性查找并返回任意值的 Proxy
对象计算出 true。