Types and tests are complementary.
They might even be synergistic:
The two together can accomplish what neither can alone.
They definitely are not rivalrous goods,
and if you’re picking only one,
you’re doing yourself a disservice.
If You Have To Pick One, Though
There’s a ceiling to how far we can get with types.
Most languages developers work in have rather limited type systems.
Most developers lack the skill, practice, and simple exposure to past examples
to make use of more powerful type systems.
That’s not a slight: Generating those examples today can be a good way to get
yourself at least a Masters if not a PhD.
We can push automated testing really far regardless of type system.
There’s an abundance of popular literature on the subject.
If you want to get better, you don’t have to look far,
and you can put what you learn to practice immediately.
If you had to pick between
either building 100% TDD’d code in a unityped language
or building code with no automated tests in a conventionally typed language,
you’d be a fool not to pick the TDD’d codebase.
But You Don’t, So Use Both
You don’t have to choose one or the other.
Reject the false dichotomy,
chase off its acolytes on their hobby horses,
and make the most of all the technologies available to you today
to produce better software.