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

欢迎!请参阅 关于 页面以了解更多关于该功能的信息。

0
ClojureScript
Closure [Spec For Union Types|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. 检查由 Closure 识别的 js 全局变量,如 document 或 window
    1. 允许点分隔的形式通过,这样我们就可以使用在 externs 中定义的类型,避免不必要的解析
    1. 使用 ana/resolve-existing-var 并带有 "未解决的 jsdoc 类型" 警告
    1. 检查解析的变量是否是一个协议,否则发出警告。这比 Closure 的标准未识别类型错误更有信息量

  • 为 comp/resolve-types 编写的测试

0

评论者: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}} 产生了解决的名称,但实际上它们不应该这样做。例如: "@implements {cljs.core.async.impl.timers.Object}" --> 错误的类型注释

因为 {{Object}} 是一个特殊情况,所以只需将其从注释中排除即可修复它。另一个补丁即将到来

0
by

评论者:pkillean

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

这产生了一个有趣的结果!没有更多的错误类型注释后,静态分析现在可以继续进行了...它有很多要说的。有关arity不匹配(特别是 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](https://developers.google.com/closure/compiler/docs/js-for-compiler#types) 文本:这里)

0

评论者:pkillean

更新补丁

0

评论者:mfikes

CLJS-1627-5.patch不再适用

0

评论者:pkillean

第6个补丁
使js注释通过comp/emit-comment路线,该路线已被修改以处理内联注释。
支持的标签: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不适用于当前master

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