Clojure Spec:地图?是否因为规范认为我的数据结构是矢量而失败?

时间:2018-12-13 14:46:56

标签: clojure clojurescript clojure.spec clojurescript-javascript-interop

我正在尝试验证Spec中的大型Clojure数据结构。

我在这方面失败了:

{:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]}

使用此:

(s/def ::WorkPage (s/keys :req-un [::pageName ::pageType ::cells]))

此消息失败(来自解释)

{:pageName "HelloWorld", :pageType :assemblage.db/workPage, :cells ["Hello World" "How are you?"]} db.js:52:1
false db.js:54:1
-- Spec failed --------------------

  [:pageName "HelloWorld"]
  ^^^^^^^^^^^^^^^^^^^^^^^^

should satisfy

  map?

如果我在REPL中单独运行上述规范,它将起作用。

但是在上下文中(在clojurescript文件中),看起来好像数据结构在被测试之前就已经被转换成向量。

以前有人看过这样的东西吗?

这可能是在ClojureScript中执行此操作的结果吗?这是一些怪异的javascript强制泄漏并咬我吗?

还是可能完全不同?

1 个答案:

答案 0 :(得分:0)

我相信这张地图的Spec定义:

{:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]}

应类似于:

(s/def ::my-map (s/keys :req-un [::pageName ::pageType ::cells]))

可以这样使用:

(s/valid? ::my-map {:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]})

在您的帖子中-您已经在地图内部获得了定义的键,这可能会导致问题。

Spec失败(至少在JS端),通常是:

should satisfy map?

就像当您以相同的名称等注册更多规范密钥时一样。