目前,除了测试和不受动态变量覆盖的外,没有方法可以强制在函数上使用 {{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)]