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. 检查由Closure识别的js全局变量如document或window
    1. 允许点分隔形式通过,这样我们就可以使用externs中定义的类型,而不必进行不必要的解析
    1. 使用 ana/resolve-existing-var 并带有“未解析的jsdoc类型”警告
    1. 检查解析的变量是否是协议,否则会发出警告。这比闭合标准的不识别类型错误更具有信息性

  • 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,字符串和数字小写.
支持显式可以为null的类型,变量类型参数
* 函数类型上下文修饰符 {{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
添加宏核心: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报告)
...