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

欢迎!有关如何工作的更多信息,请参阅 关于 页面。

0
Spec
目前,除了测试和不受动态变量覆盖的外,没有方法可以强制在函数上使用 {{fdef}} 验证。在函数中强制执行验证可以通过以下方式之一完成:使用 a) {{:pre}} 钩子或 b) 手动调用 {{s/conform}} / {{s/valid?}},但这不会对函数文档做出贡献。有许多情况适用于始终验证输入的函数,例如当在应用程序启动时配置组件时,这仅在性能代价不大且正确性很重要的情况下执行一次。

Schema 有 {{:always-validate}} 元数据来处理这种情况


(require '[schema.core :as s])

(s/defn ^:always-validate interceptor-x
  [opts :- {:string? s/Bool}])

(interceptor-x {})
; 编译错误 (ExceptionInfo) 在 (test.cljc:150:1) 时编译。
; interceptor-x 的输入未匹配模式
;
;       [(named {:string? 缺少必要键} opts)]

2个答案

0

评论发表者:ikitommi

可能像这样

`
(require '[clojure.spec.alpha :as s])

(defn plus1 [x]
(inc x))

(s/fdef ^:always-validate plus1

    :args (s/cat :x int?))

(plus1 "1")
; 编译错误 (ExceptionInfo) 在 (user.clj:18:1) 时编译。
; 对 user/plus1 的调用不符合规范。
`

0
参考:https://clojure.atlassian.net/browse/CLJ-2498 (由 ikitommi 报告)
...