Or we can just drop TypeScript completely and type-check JavaScript directly.

With HM-style type inference, row-polymorphism, sum types, type classes for overloading + operations, recursive types for object methods, and type annotations for edge cases.

I've been working on this since before TypeScript existed. Latest incarnation: https://github.com/sinelaw/inty

Demo: https://sinelaw.github.io/inty/ (you may need to reload once)

typescript is two things: a language, and a type system.

that same type system exists in the javascript language (jsdoc). doing those type checks is the 'slow' part that makes go / rust appealing. not just stripping types to emit js.

isn't it better to use JSDoc ?

I assume you mean jsdoc + tsc in js type checking mode (tsc --allowJs --checkJs --strict)?

inty infers more - including generics (parametric polymorphism), while tsc is more of a simpler local inference.

inty is more strict - it accepts less programs than tsc would. This is mostly on purpose (to our benefit) as some of those programs have unsound code like array covariant (downcasting array members of the wrong type). tsc makes it easier to slip through these bugs.

And if tsc + jsdoc is good then the same question remains (do we really need the TypeScript language?)