Надо различать статическую/динамическую и сильную/слабую типизацию.
В языке C типизация статическая (надо явно объявлять типы переменных), но слабая (разрешено автоматическое неявное преобразование типов) - так что надёжность C-кода ещё ниже, чем надёжность JavaScript-кода.
Сильная (неявное преобразование типов запрещено) статическая типизация позволяет писать многократно более надёжный код - да, за счёт того, что код пишется чуть медленнее. Динамические языки позволяют очень быстро написать скрипт, содержащий множество ошибок, которые интерпретатор не обнаружит.
Хуже всего дела обстоят в JS - там в принципе контроля типов не существует.
Из популярных динамических языков более-менее нормальный контроль типов есть только в PHP (с Ruby работать не приходилось, так что про контроль типов в этом языке ничего не знаю).
Аннотации типов в Python - филькина грамота. Такой код будет выполнен без каких либо предупреждений и ошибок и напечатает xyz:
def tst(a : dict, b: float) -> bool: return a + b
print(tst('x', 'yz'))
Т.е. в коде типы объявлены, а по факту интерпретатору Python на все эти объявления глубоко насрать.
И никакая IDE не сможет показать все несоответствия типов. Даже полноценные статические анализаторы выявить все ошибки не могут, а уж пародия на статический анализатор, работающая в реальном времени в IDE, тем более.
Но в Python ситуация всё же чуть лучше, чем в JS - за счёт запрета на автоматическое преобразование string <-> number. Впрочем, это не делает типизацию Python сильной: другие автоматические преобразования типов в языке разрешены, так что в Python та же слабая динамическая типизация.
Просто решил поделиться своей болью. Что думаете вы?