TypeScript

TypeScript is most valuable at system boundaries

Strict types at API edges and shared contracts prevent whole classes of drift. We invest typing where data crosses process or team boundaries—not inside every helper.

Chasing 100% typed internals in a moving product often yields diminishing returns. Clear types for HTTP payloads, event schemas, and database rows pay off immediately because those surfaces change under pressure.

We generate or validate types from OpenAPI and shared packages so frontend and backend do not silently disagree. When a field renames, the build breaks in both places—that is the feature.

Pragmatic escape hatches are fine at leaf utilities; they should not appear at the boundary where untrusted input enters the system.