TypeScript's number type is a lie
TypeScript's number type lacks the ability to enforce type safety for different numerical units, leading to potential bugs in code. Developers often encounter issues when passing numbers with different meanings to functions expecting specific units. To mitigate this, some teams implement custom types and ESLint rules to ensure proper handling of numerical values with associated units.
- ▪TypeScript allows any number to be passed to functions without recognizing the unit of measurement.
- ▪This can lead to significant bugs, such as miscalculating time intervals or financial transactions.
- ▪Developers can create opaque type tags to differentiate between units but face challenges when performing arithmetic operations.
Opening excerpt (first ~120 words) tap to expand
TypeScript’s number type is a lieDaniel Brain8 min read·Just now--ListenSharePress enter or click to view image in full size5000 is 5000 is 5000.It might be milliseconds. It might be seconds. It might be the year, the price in cents, the height in pixels, or the number of bytes in your payload. TypeScript has no idea. It will happily let you pass any of them to any function that takes a number. That is not type safety. That is a vibe.This is the bug you wrote last week:setTimeout(retry, 5); // 5 milliseconds, not 5 seconds. Whoops.This is the bug your coworker wrote:const expiresAt = Date.now() + ttl; // ttl is in seconds.
…
Excerpt limited to ~120 words for fair-use compliance. The full article is at Medium.