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

欢迎!请查阅关于页面以获取更多有关如何使用本网站的信息。

0 投票
ClojureScript
闭包[联合类型规范|https://developers.google.com/closure/compiler/docs/js-for-compiler#unions]声明,联合类型表达式需要圆括号。尝试这样...



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

 
引发闭包错误


...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 meta 数据。只需扩展 {{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 的发出*方法现在过滤掉对象协议。

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

0 投票

评论由:pkillean

CLJS-1627-3.patch
修复 requires extern
添加 Array & Object 的类型应用支持
GC喜欢使用大写字母来表示对象和数组,小写字母来表示字符串和数字。
支持显式可为空的类型,变量类型参数。
函数类型上下文修饰符 {{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发表的评论:

嘿,帕特里克,CLJS-1627-6.patch不适用于master。

0 投票

评论由:pkillean

应该先喝咖啡

0 投票

由mfikes发表的评论:

CLJS-1627-7.patch 不会应用于当前的master分支

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