BillTracker/client/lib/money.type-test.ts

23 lines
1.1 KiB
TypeScript
Raw Normal View History

// Compile-time guard for the branded money types. Not imported anywhere (so it
// never ships in a bundle); `npm run typecheck` type-checks it via the tsconfig
// include, and each `@ts-expect-error` asserts the following line IS a genuine
// type error. If the cents/dollars branding ever regresses, one of these lines
// stops erroring and typecheck fails loudly ("unused @ts-expect-error").
import { formatUSD, formatCentsUSD, asCents, asDollars, centsToDollars } from './money';
const cents = asCents(1234); // $12.34 as integer cents
const dollars = asDollars(12.34); // $12.34 as dollars
// ✅ Correct unit → compiles fine.
formatUSD(dollars);
formatCentsUSD(cents);
formatUSD(centsToDollars(cents)); // cross the boundary explicitly
// ❌ Unit mixups → compile errors (the class of bug we keep fixing).
// @ts-expect-error cents can't be formatted as dollars (would render 100× too big)
formatUSD(cents);
// @ts-expect-error dollars can't be formatted as cents
formatCentsUSD(dollars);
// @ts-expect-error a raw number must be branded (asDollars/asCents) first
formatUSD(1234);