2024年Clojure调查!中分享您的想法。

欢迎!请查看关于页面以获取更多关于本站如何工作的信息。

0
ClojureScript
封装[Closure的联合类型规范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. 允许 dot.delimited.forms 通过,这样我们就可以使用在外部和定义的类型,从而避免不必要的解析
    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 提出

这揭示了有问题的地方,{{deftype}} + {{defrecord}}使用对象协议发出解析名称,实际上它们不应该这样做。例如:"@implements {cljs.core.async.impl.timers.Object}" --> 错误的类型注解

由于{{Object}}是一个特殊情况,因此仅从注释中排除它应修复它。即将推出另一个补丁

0

评论由:pkillean 提出

CLJS-1627-2.patch
deftype和defrecord的emit*方法现在过滤掉对象协议。

这产生了一个有趣的结果!没有更多的错误类型注解,静态分析现在可以继续...并且有很多要说的。现在有了关于词法差异的所有种类的信息(尤其是cljs.core.IndexedSeq),类型不匹配等。它甚至包括了类型覆盖率百分比。有很多要解析的地方,但非常酷。

0

评论由:pkillean 提出

CLJS-1627-3.patch
修复外部require
添加数组和对象类型应用支持
GC更喜欢大写Object & Array,小写string,number.
支持显式可为null的类型和变体参数
* 函数类型上下文修改符{{this}} + {{new}}

-Missing是GC 'record type'- . 也有可能有用地填写常见类型的节点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 不适用于当前主分支

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