目前,除了测试和无法被动态变量覆盖之外,没有方法可以强制函数{{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的输入与schema不匹配
;
; [(:missing-required-key {:string? missing-required-key} opts)]