We’re in the midst of a programming language renaissance, with a host of new languages that emphasize ergonomics, performance, and correctness. For programming close to the metal, there’s Rust. On Apple devices, we have Swift. The CLR and JVM offer a variety of good choices. Haskell is wonderful for high-performance, concurrent backend services.
TypeScript’s has committed to
one-to-one. Unfortunately, this implies that TypeScript lacks some useful cost-free abstractions,
like strong type aliases (aka newtypes) and type-directed name resolution (like traits). TypeScript
does not use type knowledge to generate code, so you can’t compare tuples with
<, for example.
In addition, there are situations where TypeScript is intentionally unsound for convenience.
In TypeScript, sometimes there are situations where type annotations are necessary even though an accurate type /could/ be inferred.