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}} 使用 Object 协议在实际上不应该发出已解析名称时发出。例如:"@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外部使用错误
添加对数组 & 对象的类型应用支持
垃圾收集器喜欢将Object & Array设置为大写字母,string和number设置为小写字母。
支持显式的可空类型,变量类型参数
* 函数类型上下文修饰符 {{this}} + {{new}}

缺少的是垃圾收集器的 '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
添加内核核心宏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报告)
...