"tsc isn't one command — it's a Swiss Army knife with several blades."
The modes you'll use most
tsc — full type check + emit. The default. Slowest mode; produces .js output.
tsc --noEmit — type check only. Used for CI 'does it compile?' checks where you don't need .js output (because some other tool produces it). Faster than full compile.
tsc --watch — keeps running, re-checks on file changes. Used during development for fast incremental feedback. Combined with --noEmit, you get continuous type checking.
tsc --incremental — caches type-checking state in .tsbuildinfo. Subsequent runs only re-check what changed. Essential for large projects.
tsc -b / --build — project references build mode. Coordinates multi-package monorepo builds. We cover this in the next lesson.
How real projects use them
The typical setup: tsc --noEmit --incremental in CI for type-only checks, vite or esbuild for actually emitting JS, and tsc --watch --noEmit in development IDE/terminal for continuous feedback. The split is deliberate — let the fast transpiler do the build; let tsc focus on type-checking.
tsc for emit in modern projects. Vite, esbuild, swc, Bun, Deno are all 10-100x faster at producing JavaScript. Let them. Use tsc only for type-checking, where it has no equivalent.