Thanks for the feedback!
Actually, schema can express arbitrary constraints. Your example translates to schema as:
{String {(s/required-key "product") [String]
(s/required-key "type") (s/enum "type1" "type2")
s/Any s/Any}} ;; allow any other k-v pairs