http://erlang.org/doc/apps/dialyzer/dialyzer_chapter.html
http://elixir-lang.org/getting-started/typespecs-and-behavio...
Not the same as TypeScript or Haskell, but may help.
Note that Erlang/Elixir programmers don't care about most runtime errors as we use Supervisors to restart processes that may crash because of them.
That doesn't give me a whole lot of comfort. A program that handles crashes gracefully doesn't fix its own mistake. Supervision is great, but it's even better to not have the crash in the first place.
Note that "practical" functional programming is something I just made up, but in general to me it means a language that provides immutable data, first class functions/higher order functions, and provides ways to minimize side effects. Elixir/Erlang do these. The language is geared towards functional programming, but it's impure.
But compare it to Haskell, a "pure" language: Elixir has no strong types, monads/functors/burritos, you can do side effects whenever you want with no penalty, there aren't many restrictions or things the compiler will yell you at about that aren't obvious mistakes.
I'm not saying either choice is better, but the average developer with little experience in both Elixir and Haskell can probably build a product faster in the former.