Python with a strict linter and type checker (eg ruff with the right lints on and ty with its stricter settings, or strict pyright if performance isn't too bad) works very well. Most of Python strengths (concise, large ecosystem, well represented in the LLM training data) while having good static analysis.
You don't need that, gets in the way more than it helps. Even Typescript isn't really needed, but at least it's decent devex unlike the Python typing stuff. What really helps is testing.
I try to capture as much as possible in types/schemas/constraints (then lint rules) and then only as a last resort write tests. And as few and complementary as possible. And I want a functional core with unit tests and imperative shell and not a bunch of complex mocks. ¯\_(ツ)_/¯
Some kind of testing is needed if you care at all about it being reliable, whether or not you have type checks. It can just be a few simple tests like a smoke. You don't need tests that directly check for correct types. If you're using a wrong type somewhere, it'll become obvious. Without type checks, I've never had a bug in prod caused by wrong types, it's always something else.