在 "2024 年 Clojure 国情调查!" 中分享您的想法。

欢迎!请参阅 "关于" 页面获取更多关于这个站点如何运作的信息。

0
ClojureScript
Closure [联合类型规范|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

评论者:dnolen

补丁正在改进中,请移除 js-doc-type 元数据。只需将 {{resolve-existing-var}} 的签名扩展以接受一个额外的参数 - {{confirm-var-exists}} 处理程序。

0

评论由:pkillean 于

CLJS-1627-1.patch
{{resolve-existing-var}} 现在有一个额外的身份,接受传递给 {{confirm-existing-var}} 的缺失变量处理程序。

0

评论由:pkillean 于

这揭示了一个问题,其中 {{deftype}} + {{defrecord}} 使用对象协议发出解析的名称,而实际上它们不应该这样做。例如:"@implements {cljs.core.async.impl.timers.Object}" --> 错误的类型注解

由于 {{Object}} 是一个特殊情况,简单地从注释中排除它应该可以解决这个问题。即将推出另一个补丁

0

评论由:pkillean 于

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

这产生了一个有趣的结果!没有更多的错误类型注解,静态分析现在可以继续... 它有一大堆要说的话。现在有关身份差异(尤其是 cljs.core.IndexedSeq)的类型不匹配以及其他信息。甚至包括类型覆盖率百分比。有很多东西要解析,但非常酷。

0

评论由:pkillean 于

CLJS-1627-3.patch
修复 require 外部
为 Array 和 Object 添加类型应用支持
GC喜欢对Object和Array使用大写,对字符串和数字使用小写。
支持显式的可空类型和可变类型参数。
* 函数类型上下文修饰符 {{this}} + {{new}}

- 缺少GC的“record类型”。填写常见类型的节点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](https://clojure.atlassian.net/browse/CLJS-1627)(由 pkillean 报告)
...