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 - 类型注解错误。期望有 closing}
* @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 类型'。填写普通类型节点的 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

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

0

评论者:pkillean

本应该先喝咖啡

0

评论者:mfikes

CLJS-1627-7.patch 无法应用于当前的主干

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