The fundamental problem is that Typescript (and JavaScript) doesn't have tagged unions. In Rust or even C++ using std::variant this isn't a problem.
As does Flow: https://flow.org/blog/2015/07/03/Disjoint-Unions/
Definitely a fair point that it is a few more keystrokes, though.
https://gist.github.com/frankpf/cde7f792580f731dfe886ed2d91b... (see the second file for usage)