当任何 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