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. 允许.dot分隔式样通过,这样我们就可以使用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}} 传递的 missing-var 处理器。

0 投票

评论由:pkillean

这揭示了一个问题,其中使用 Object 协议的 {{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 extern
为 Array & Object 添加类型应用支持
GC 喜欢将 Object & Array 的大小写设置为大写,字符串和数字为小写。
对显式可空类型和变量类型的参数的支持
* 函数类型上下文修饰符 {{this}} + {{new}}

- 缺少 GC 'record 类型'。还为填充常见类型的节点 extern 提供了便利

0 投票

评论由:pkillean

CLJS-1627-4.patch
修正上一补丁中的一些问题

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 添加 macro core/goog-typedef。这使得您可以通过在注解中引用它来命名自定义类型。

还需要进行更多工作以支持多参数函数,但我想这已经解锁了基本的静态类型检查 -)

0 投票

评论者:mfikes

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

0 投票

评论由:pkillean

应该先喝咖啡

0 投票

评论者:mfikes

CLJS-1627-7.patch 不适用于当前的主分支

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