TypeScript Code Style Guide
Types and Type Safety
- •Avoid explicit type annotations when TypeScript can infer
- •Avoid implicitly
any; explicitly type when necessary - •Use accurate types: prefer
Record<PropertyKey, unknown>overobjectorany - •Prefer
interfacefor object shapes (e.g., React props); usetypefor unions/intersections - •Prefer
as const satisfies XyzInterfaceover plainas const - •Prefer
@ts-expect-errorover@ts-ignoreoveras any - •Avoid meaningless null/undefined parameters; design strict function contracts
Async Patterns
- •Prefer
async/awaitover callbacks or.then()chains - •Prefer async APIs over sync ones (avoid
*Sync) - •Use promise-based variants:
import { readFile } from 'fs/promises' - •Use
Promise.all,Promise.racefor concurrent operations where safe
Code Structure
- •Prefer object destructuring
- •Use consistent, descriptive naming; avoid obscure abbreviations
- •Replace magic numbers/strings with well-named constants
- •Defer formatting to tooling
Performance
- •Prefer
for…ofloops over index-basedforloops - •Reuse existing utils in
packages/utilsor installed npm packages - •Query only required columns from database
Time Consistency
- •Assign
Date.now()to a constant once and reuse for consistency
Logging
- •Never log user private information (API keys, etc.)
- •Don't use
import { log } from 'debug'directly (logs to console) - •Use
console.errorin catch blocks instead of debug package
Code Quality
- •No
anytypes unless absolutely necessary - •Check node_modules for external API type definitions instead of guessing
- •NEVER use inline imports - no
await import("./foo.js"), noimport("pkg").Typein type positions, no dynamic imports for types. Always use standard top-level imports. - •NEVER remove or downgrade code to fix type errors from outdated dependencies; upgrade the dependency instead
- •Always ask before removing functionality or code that appears to be intentional
- •Never hardcode key checks with, eg.
matchesKey(keyData, "ctrl+x"). All keybindings must be configurable. Add default to matching object (DEFAULT_EDITOR_KEYBINDINGSorDEFAULT_APP_KEYBINDINGS)