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

欢迎!请参阅 关于 页面了解一些关于它是如何工作的更多信息。

0
ClojureScript

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

ECMAScript 6 引入了 Proxy 对象,允许构建可以拦截任意属性查找的对象。一些现代 JavaScript 库(例如,Pulumi)利用此功能作为其 API 的部分,并对于 任何 属性查找都返回 "truthy" 值。

这会导致在 ClojureScript 中打印这些对象时出现代码错误,包括在 REPL 中,并且在处理这些库生成的对象时使 REPL 几乎无法使用。

在一般情况下,不可能通过客户端代码来绕过这种限制,因为检查是在检查诸如 IPrintWithWriter 这样的替代协议之前进行的。

建议的修复方案:而不是仅测试 cljs$lang$type 属性的 "truthiness",测试一个特定值或值的类型,这样条件就不会对响应任意属性查找并返回任意值的 Proxy 对象计算出 true。

1 答案

+1

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

...