For context, I base the above sentiment on our team's last two years of effort in migrating key parts of our app to TypeScript (25 devs, ~500k lines of code). We've found that it has substantially reduced the number of defects that make it into production, and it has also reduced the number of round trips through QA. Clearly, this is only one data point, but hopefully it offers some perspective on why TS can be valuable in a codebase.
TS/JS don't allow for overloading the way that other languages do - it does not allow you to differentiate between functions via number of parameters, only types of parameters. If you try to differentiate based on number of parameters, it will simply use whichever definition of that function name it finds first.
Declaration file style:
---
// add.d.ts
export declare function add(a: number, b: number): number;
export declare function add(a: number, b: number, c: number): number;
export declare function add(a: number, b: number, c: number, d: number): number;
--- // add.js
function add() {
switch (arguments.length) {
case 2:
return arguments[0] + arguments[1];
case 3:
return arguments[0] + arguments[1] + arguments[2];
case 4:
return arguments[0] + arguments[1] + arguments[2] + arguments[3];
default:
throw new Error("Too few or too many arguments. Number of arguments: " + arguments.length);
}
}
module.exports = { add };
--- // adding.ts
import { add } from "./add";
console.log("4 + 4 =", add(4,4));
console.log("4 + 4 + 4 =", add(4,4,4));
console.log("4 + 4 + 4 + 4 =", add(4,4,4,4));
---(Gist: https://gist.github.com/Robert-Fairley/98a2da3f0361e524f4e05...)
It will default to the first function name, but it definitely allows for overloading the number of parameters.
It's not perfect as you do still have to implement the function as it would need to be implemented for JS
This might be news to you, but JS is full of types regardless of whether you document and automatically check them.
I prefer to document my types and have them properly checked, plus the IDE advantages.