TypeScript Development (2025)
Core Principles
-
Strict typing: Enable all strict checks
-
Parse, don't validate: Transform untrusted data at boundaries
-
Composition over inheritance: Small, focused functions
-
Explicit over implicit: No any , prefer unknown
Toolchain
bun # Runtime + package manager (fast) vite # Frontend bundling vitest # Testing eslint # Linting prettier # Formatting
Quick Patterns
Type Guards
function isUser(value: unknown): value is User { return typeof value === "object" && value !== null && "id" in value; }
Discriminated Unions
type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };
function processResult<T>(result: Result<T>): T { if (result.ok) return result.value; throw result.error; }
Utility Types
type UserUpdate = Partial<User>; type UserSummary = Pick<User, "id" | "name">; type UserWithoutPassword = Omit<User, "password">; type ReadonlyUser = Readonly<User>;
tsconfig.json Essentials
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true, "noImplicitReturns": true, "isolatedModules": true } }
References
-
PATTERNS.md - Code patterns and style
-
REACT.md - React component patterns
-
TESTING.md - Testing with vitest
Commands
bun install # Install deps bun run build # Build bun test # Test bun run lint # Lint bun run format # Format