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

欢迎!有关如何工作的更多信息,请参阅 关于 页面。

0
ClojureScript
闭包 [联合类型规范|https://developers.google.com/closure/compiler/docs/js-for-compiler#unions] 规定,联合类型表达式需要使用括号。尝试以下操作...



(defn foo
  "@param {(IBar|IMap)} x"
  [x]
  ...)

 
引发 Closure 错误


...ERROR - 类型注解错误。期望关闭的}
* @param {user.(IBar|user.IMap)}


这是因为 comp/resolve-types 将括号视为类型标记的一部分,从而引发错误的变量解析。此外,编译器使用 "|" 字符分隔多个解析类型,但未用括号将它们括起来以创建有效的联合类型。

15 个回答

0

评论者:pkillean

此补丁包括

  • comp/resolve-types 现在在存在时移除括号,并在检测到 >1 个类型时生成它们。这使得括号使用成为可选的,并且现有代码保持不变(附带的好处是它现在可能可以工作)

  • comp/resolve-type 的更改
    1. 检查 js 全局变量,如 document 或 window,这些全局变量被 closure 识别
    1. 允许 .delimited.forms 通过,因此我们可以使用在 externs 中定义的类型,避免不必要的解析
    1. 使用 ana/resolve-existing-var 并带有 "未解析的 jsdoc 类型" 警告
    1. 检查解析变量是否是协议,如果不是,则警告。这比 Closure 的标准未识别类型错误更具有信息性

  • comp/resolve-type 的测试

0
by

评论者:dnolen

谢谢,我会尽量明天更仔细地查看。

0
by

评论者:dnolen

补丁正在接近目标,请移除 js-doc-type 元数据。只需将 {{resolve-existing-var}} 的签名扩展以接受额外的参数 - {{confirm-var-exists}} 处理器。

0
by

评论者:pkillean

CLJS-1627-1.patch
{{resolve-existing-var}} 现在接受一个参数,该参数是一个传递给 {{confirm-existing-var}} 的缺少变量处理器。

0
by

评论者:pkillean

这揭示了一个问题,即使用对象协议的 {{deftype}} 和 {{defrecord}} 会发出解析名称,其实 shouldn't。例如 : "@implements {cljs.core.async.impl.timers.Object}" --> 错误类型标注

由于 {{Object}} 是一个特殊情况,只需将该注释排除在外即可修复它。即将推出另一个补丁

0
by

评论者:pkillean

CLJS-1627-2.patch
deftype 和 defrecord 的 emit* 方法现在过滤掉对象协议。

这产生了有趣的结果!没有更多错误的类型注释后,静态分析现在可以继续...并且有很多要说的。现在有各种关于算术差异(尤其是 cljs.core.IndexedSeq)的信息,类型不匹配等。甚至包括类型覆盖率百分比。这里有大量要解析的内容,但非常酷。

0
by

评论者:pkillean

CLJS-1627-3.patch
修复 require extern
为 Array & Object 添加类型应用支持
GC 喜欢大写 Object & Array,小写 string,number。
支持显式可空类型、变量类型参数
函数类型上下文修饰符 {{this}} + {{new}}

缺少GC '记录类型' 。填充常见类型的节点externs也可能有帮助

0

评论者:pkillean

CLJS-1627-4.patch
修复了上一个补丁中的一些问题
添加记录类型支持。以下内容应包含在内(链接:https://developers.google.com/closure/compiler/docs/js-for-compiler#types 文本:这里)

0

评论者:pkillean

更新补丁

0

评论者:mfikes

CLJS-1627-5.patch不再适用

0

评论者:pkillean

第6个补丁
通过comp/emit-comment处理js注释,该功能已被修改以支持内联注释。
支持的标签:param, return, type, implements, typedef, enum, extends, throws, lends, const, this
添加宏core/goog-typedef,这允许您命名自定义类型,并在注释中引用它。

还需要更多工作来支持多参数函数,但我认为这基本解锁了基本的静态类型检查 :-)

0

评论者:mfikes

嘿,Patrick,CLJS-1627-6.patch不适用于master。

0

评论者:pkillean

应该先喝杯咖啡

0

评论者:mfikes

CLJS-1627-7.patch 不可应用于当前主分支

0
参考: https://clojure.atlassian.net/browse/CLJS-1627 (由 pkillean 报告)
...