That's a major limitation of JavaScript. For example:
// TypeScript
function add(a: number, b: number): number { return a + b; }
// tsc output (JavaScript)
function add(a, b) { return a + b; }
// (ab)use by someone using my lib without TypeScript
add("abc", "def");
Now, addition is a contrived example because it'll still work with strings, but the point is that such usage violates my code contract because the contract was deleted during compilation. It's possible to do this:
function add(a: number, b: number): number {
if (typeof a !== 'number' || typeof b !== 'number')
throw 'no';
return a + b;
}
But that's needlessly verbose, and eslint will complain about useless code. If enforceable type annotations could be added to JavaScript, that'd be a huge plus.