В Elixir v1.20 появилась долгожданная система типов. Её начали разрабатывать ещё в 2022 году, а в июне 2023 опубликовали научную статью. Теперь первый этап готов: компилятор умеет выводить типы и проверять их постепенно (gradual typing) без единой аннотации от разработчика. Elixir сам находит мёртвый код и verified bugs — нарушения типов, которые гарантированно упадут в рантайме. При этом ложных срабатываний практически нет.
Ключевая фишка — тип dynamic(). В отличие от any() в других языках, который пускает всё, dynamic() в Elixir работает как диапазон с двумя свойствами: совместимостью и сужением. Если переменная, скажем, integer() or binary(), то при вызове функции, ожидающей число, ошибки не будет, потому что типы не пересекаются — переменная может оказаться числом. А вот если попытаться передать её в Map.fetch!, который ждёт map, то типы пересекаться не будут — система выдаст verified bug. При этом dynamic() сужается по мере использования: если в коде написано data.a + data.b, тип data уточняется до %{..., a: number(), b: number()}. Если потом написать data.a + data, второе вхождение data не подойдёт под number() — будет нарушение.
Типизация работает и с guards, и с конструкциями вроде case. Например, System.get_env("SOME_VAR") возвращает nil или binary(). Если первый клоз ловит nil, то во втором value уже считается только binary() — никаких ложных срабатываний. Система отслеживает размер кортежей, наличие ключей в map, сложные условия. В стандартной библиотеке типизированы многие функции для работы с кортежами и map.
Elixir v1.20 также ускорил компиляцию: синтетические бенчмарки показали, что его сборочный инструмент — самый быстрый среди BEAM-языков. Появилась опция :module_definition с режимом :interpreted, которая ещё больше ускоряет сборку в крупных проектах, не влияя на итоговый .beam-файл.
В планах — введение полноценных типовых сигнатур, но только когда команда будет довольна производительностью, реализует рекурсивные и параметрические типы, а также научится эффективно обрабатывать ключи map как перечисляемые. Обсуждения — в Elixir Forum. А пока стоит обновиться и пофиксить все баги, которые v1.20 найдёт бесплатно.