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

欢迎!请查看 关于 页以了解更多关于这个工作的信息。

0 投票
ClojureScript
当任何 deftype/defrecord 在 Object 上定义方法时,CLJS 编译器将发出一个无效的类型注解,这在启用类型检查时,Closure 会发出警告。


(ns demo.type)

(deftype Foo [a b]
  Object
  (foo [this x]
    x))


会产生此 JS


/**
* @constructor
 * @implements {demo.type.Object}
*/
demo.type.Foo = (function (a,b){
this.a = a;
this.b = b;
});


产生以下警告


类型注解错误。未知类型 demo.type.Object


分析器数据表明它确实解析错误。


 ...
 :defs
 {Foo
  {:num-fields 2,
   :protocols #{demo.type/Object},
   :name demo.type/Foo,
   :file "demo/type.cljs",
   :end-column 13,
   :type true,
   :column 10,
   :line 3,
   :record false,
   :end-line 3,
   :skip-protocol-flag nil},


并不完全清楚这是如何绕过检查的,但它可能是一个过多通用的检查 Object 的迹象,它没有检查命名空间。

AFAICT,对 CLJS 分析器/编译器没有任何坏的影响。当启用类型检查时,Closure 会抱怨,但除此之外似乎没有受到影响。

尚未确定问题的开始点,但看起来像是 cljs.analyzer/resolve-var 没有正确地解析带 ns 的 Object,参见[1]。

[1] https://github.com/clojure/clojurescript/blob/998933f5090254611b46a2b86626fb17cabc994a/src/main/clojure/cljs/core.cljc#L1669-L1673

1 答案

0 投票
参考: https://clojure.atlassian.net/browse/CLJS-2380 (由 thheller 报告)
...