Maybe it is only my experience, but i feel that languages that were not typed since the begining never work as well as "true" typed ones.
Conversely, TypeScript is my favourite type system because it has to support the wild things people did in untyped languages.
I think Elixir is taking a very mature path to typing. No type-annotations (yet) just type inference from existing language constructs like function guards and pattern matching. Also trying to minimize false positives, only giving type errors when it would provably crash at runtime.
I agree with you but an alternative view, "Why are gradual static types so great?" https://www.benkuhn.net/gradual/
I've experienced this, but it's mostly because languages like Python and TypeScript give you way too many escape hatches. I get the intent: allow devs to convert their code base slowly. But in practice it just lets developers opt out of the benefits of typing to "save time" in the short run.
It also takes a long time for the ecosystem to catch up. It can be hard to retrofit static types over something that wasn’t built with them in mind
Typescript is brilliant and should be carefully studied by anybody introducing a type system to a single typed ("untyped") language.
It was poorly bolted on in Python. Well I dislike types to begin with, but aside from that, Typescript somehow did it better.
Elixir's heavy reliance on pattern matching has always made it kind of "dynamic language where you still have to think about types" vibe to it. It's also always had a spec meta-language (taken from Erlang) which a lot of people use. You should read up on how they have been implementing the type system, it's pretty interesting! I would not say it's "bolted on." It also has full inference so all codebases get the benefit of it whether you specify types or not.