People still talk about static vs dynamic typing. But the discussion is mostly futile. The rift between static and dynamic started before most of us were born, in Mathematics. No amount of discussion by even above-average programmers is going to solve this one, or even contribute to the discussion.
David Nolen talks about a common pattern called Programming by Contract and how it is used in Clojure and ClojureScript. Programming by Contract is a way of asserting dynamic properties of function arguments and return values. You should also read the follow-up.