2024年Clojure状况调查!中分享你的想法。

欢迎!请访问关于页面以获取更多关于如何使用本站的信息。

0
ClojureScript
《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),由Closure识别
    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协议。

这产生了有趣的结果!在没有了错误类型注解后,静态分析现在可以继续...并且有很多要说的。现在有各种各样的信息,如类型不匹配、数字类型和更多。它甚至还包含类型覆盖率百分比。这里有很多东西需要解析,但非常酷。

0

评论者:pkillean

CLJS-1627-3.patch
修正 require extern
为 Array 和 Object 添加类型应用支持
GC喜欢大写Object & Array,小写string,number.
支持显示地可空类型,变量类型参数
* 函数类型上下文修饰符 {{this}} + {{new}}

- 缺少 GC '记录类型'。填充节点 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、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 报告)
...