23 lines
1.1 KiB
TypeScript
23 lines
1.1 KiB
TypeScript
|
|
// 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);
|