2024 年 Clojure 调查问卷!中分享您的想法。

欢迎!请查阅关于页面,了解更多此平台的工作方式。

0 投票
ClojureScript
如果推断出 JavaScript 类型,则不考虑“基础”属性。一个特定示例是 {{js/document}},它被推断为 {{js/HTMLDocument}}。如果代码使用了任何基础属性,则会触发推断警告,即使在:advanced 编译中一切正常。

{code:title=src/test/infer.cljs}
(ns test.infer)

(set! *warn-on-infer* true)

(.-documentElement js/document)



$ clj -m cljs.main -co '{:infer-externs true}' -c test.infer
WARNING: 无法解析属性 documentElement 在表达式 (. js/document -documentElement) 的推断类型 js/HTMLDocument,位于行 5 /Users/mfikes/Desktop/test-infer/src/test/infer.cljs


如果添加 {{-O advanced}},您可以确认 {{documentElement}} 在编译后的结果中存活,并且没有被打扰。

此外,您可以通过指示目标为基本类型来解决这个问题


(.-documentElement ^js/Document js/document)


或许在类似这样的情况下,有一种方法可以使用 externs 中的“extends”元数据来在发出警告前检查基础类型(或者根据访问的属性推断基础类型)。以下是上述示例中感兴趣的 extends 元数据:https://github.com/google/closure-compiler/blob/50713dceb16b369f8f317e5b49e8a9dec2b47496/externs/browser/w3c_dom2.js#L171

1 答案

0 投票
参考: https://clojure.atlassian.net/browse/CLJS-2928(由 mfikes 报告)
欢迎来到 Clojure 问答,您可以在这里提出问题并从 Clojure 社区的成员那里获得答案。
...