9

假设我有以下规格:

(s/def :person/age number?)
(s/def :person/name string?)

(s/def ::person (s/keys :req [:person/name :person/age]))

然后我从 Datomic 获取一个实体:

(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"]))

如果我尝试检查与规范的一致性,它会失败,因为实体不是地图:

(s/explain ::person person-entity)

val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map?

我的应用程序具有将实体作为参数的函数,并且希望避免为了让规范检测在开发中工作而不得不将实体具体化为无处不在的映射。

我应该如何通过规范验证实体?

4

1 回答 1

3

尽管您的命名空间确实有点偏离(您应该使用 :person/name 而不是 ::name),但规范中也有一个可以取消的限制。目前 s/keys 要求所有输入集合都符合clojure.core/keys谓词。Datomic 实体不是映射,因此不通过该检查(因此有关map?谓词的错误)。

我在这里提交了一个错误报告:http: //dev.clojure.org/jira/browse/CLJ-2041如果您愿意,请随意投票/关注票。

于 2016-10-11T18:12:27.027 回答