В программе всегда есть то что проверяет компилятор статически и то что в рантайме проверяется динамически. И даже в статически типизированных языках всегда есть то что не типизируется вообще никак (если это не язык с завтипами и ты не пишешь полностью верифицированную программу). И в статически типизированных языках, особенно популярных, система типов обычно мягко говоря не очень и всё равно приходится держать миллион вещей в голове и писать миллион тестов.
Не миллион. И да, статика это почти всегда компромисс, а динамика - отсутсвие чего-либо.