Elixir 1.20 ships with gradual typing, making optional, compiler-checked type annotations a first-class feature of the language.
The Elixir team released version 1.20 with a specific label attached: gradually typed. That means developers can annotate function signatures and data structures where they want static guarantees, while leaving the rest of the codebase dynamic. The compiler checks only what is annotated; everything else behaves as before. This is a meaningful departure from Elixir's roots as a dynamic language on the Erlang VM, where static analysis was handled by external tools or skipped entirely.
Gradual typing has become the default exit ramp for dynamic languages that want to mature without breaking their ecosystems. TypeScript charted it for JavaScript; mypy and pyright did the same for Python. Both saw serious adoption once the tooling was good enough to catch real bugs without demanding a full rewrite. For Elixir, the calculus is similar: teams running large production codebases can now add type safety incrementally, starting with the modules that actually cause problems, rather than facing an all-or-nothing migration.
The caveat that applies everywhere applies here too: gradual typing is only as useful as the annotations developers actually write. Opt-in safety is better than none, but it still requires someone to opt in.