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

欢迎!请查看关于页面以了解有关此信息的工作方式。

0
ClojureScript
The 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. 对闭包识别的js全局变量(如document或window)进行检查
    1. 允许点分隔的表格形式通过,这样我们可以使用在externs中定义的类型,避免不必要的解析
    1. 使用ana/resolve-existing-var并发出“未解决的jsdoc类型”警告
    1. 检查解析的变量是否为协议,否则发出警告。这比闭包的标准未知类型错误更有信息量

  • 为comp/resolve-types编写测试

0

发表评论的人:dnolen

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

0

发表评论的人:dnolen

补丁正在接近完成,请删除 js-doc-type 元数据。只需扩展 {{resolve-existing-var}} 的签名以接受一个额外的参数 - the {{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* 方法现在过滤掉了对象协议。

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

0

评论由:pkillean发表

CLJS-1627-3.patch
修复 require 外部
为 Array 和 Object 添加类型应用支持
GC 适用于 Object & Array 的为大写,适用于 string 和 number 的小写。
支持显式 null 类型,变量类型参数
* 函数类型上下文修饰符 {{this}} + {{new}}

缺少 GC '记录类型'。填写常见类型的节点外部定义可能也很有用。

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
通过 comp/emit-comment 路由 js 注释,该组件已经修改过以处理内联注释。
支持的标签:param,return,type,implements,typedef,enum,extends,throws,lends,const,this,添加宏 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 报告)
...