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

欢迎!请参阅关于页面获取更多有关如何使用此功能的信息。

0
ClojureScript
Closure 联合类型规范指出,联合类型表达式需要括号。尝试了以下内容...



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

 
引发 Closure 错误


...错误 - 错误的类型注释。期望关闭括号}
* @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

这揭示了一个问题,其中使用 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 大写,而将 string 和 number 小写。
显式可空类型、变量类型参数支持
* 函数类型上下文修饰符 {{this}} + {{new}}

-Missing 是 GC 的 'record type'。这可能还有助于填写常用类型的 node 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
路由js注释通过comp/emit-comment,该组件已被修改以处理内联注释。
支持的标签:param、return、type、implements、typedef、enum、extends、throws、lend、const、this
添加了宏核心/goog-typedef。这可以让您命名一个自定义+类型,并在注解中引用它。

需要更多的工作来支持多参数函数,但我认为这基本上解锁了基本的静态类型检查:-)

0

评论者:mfikes

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

0

评论者:pkillean

应该先喝杯咖啡

0

评论者:mfikes

CLJS-1627-7.patch不适用于当前的master

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