typescript-core
Advanced TypeScript patterns and best practices for 2025
By bobmatnyc · 430 installs
npx skills add bobmatnyc/claude-mpm-skills --skill typescript-core
Source repository · Upstream listing
TypeScript Core Patterns
Modern TypeScript development patterns for type safety, runtime validation, and optimal configuration.
Quick Start
New Project: Use 2025 tsconfig → Enable strict + noUncheckedIndexedAccess → Choose Zod for validation
Existing Project: Enable strict: false initially → Fix any with unknown → Add noUncheckedIndexedAccess
API Development: Zod schemas at boundaries → z.infer<typeof Schema for types → satisfies for routes
Library Development: Enable declaration: true → Use const type parameters → See [advanced patterns 2025.md](./references/advanced patterns 2025.md)
Quick Reference
tsconfig.json 2025 Baseline
Key Compiler Options
Option Purpose When to Enable
noUncheckedIndexedAccess Forces null checks on array/object access Always for safety
exactOptionalPropertyTypes Distinguishes undefined from missing APIs with optional fields
verbatimModuleSyntax Enforces explicit type only imports ESM projects
erasableSyntaxOnly Node.js 22+ native TS support Type stripping environments
Local Baselines
See references/configuration.md for repo specific tsconfig patterns (CommonJS CLI, NodeNext strict, Next.js bundler).
Core Type Patterns
Const Type Parameters
Preserve literal types through generic functions:
Satisfies Operator
Validate against a type while preserving literal inference:
Template Literal Types
Type safe string manipulation and route extraction:
Discriminated Unions with Exhaustiveness
Runtime Validation
TypeScript types disappear at runtime. Use validation libraries for external data (APIs, forms, config files).
Quick Comparison
Library Bundle Size Speed Best For
Zod ~13.5kB Baseline Full stack apps, tRPC integration
TypeBox ~8kB ~10x faster OpenAPI, performance critical
Valibot ~1.4kB ~2x faster Edge functions, minimal bundles
Basic Pattern (Zod)
→ See [runtime validation.md](./references/runtime validation.md) for complete Zod, TypeBox, and Valibot patterns
Decision Support
Quick Decision Guide
Need to choose between type vs interface ?
Public API / library types → interface
Union types / mapped types → type
Simple object shapes → interface (default)
Need generics or union types?
Output type depends on input type → Generics
Fixed set of known types → Union types
Building reusable data structures → Generics
Dealing with unknown data?
External data (API, user input) → unknown (type safe)
Rapid prototyping / migration → any (temporarily)
Need runtime validation?
Full stack TypeScript with tRPC → Zod
OpenAPI / high performance → TypeBox
Edge functions / minimal bundle → Valibot
→ See [decision trees.md](./references/decision trees.md) for comprehensive decision frameworks
Troubleshooting
Common Issues Quick Reference
Property does not exist on type → Define proper interface or use optional properties
Type is not assignable → Fix property types or use runtime validation (Zod)
Object is possibly 'undefined' → Use optional chaining ( ?. ) or type guards
Cannot find module → Check file extensions (.js for ESM) and module resolution
Slow compilation → Enable incremental , use skipLibCheck , consider esbuild/swc
→ See [troubleshooting.md](./references/troubleshooting.md) for detailed solutions with examples
Navigation
Detailed References
[📐 Advanced Types](./references/advanced types.md) Conditional types, mapped types, infer keyword, recursive types. Load when building complex type utilities or generic libraries.
[⚙️ Configuration](./references/configuration.md) Complete tsconfig.json guide, project references, monorepo patterns. Load when setting up new projects or optimizing builds.
[🔒 Runtime Validation](./references/runtime validation.md) Zod, TypeBox, Valibot deep patterns, error handling, integration strategies. Load when implementing API validation or form handling.
[✨ Advanced Patterns 2025](./references/advanced patterns 2025.md) TypeScript 5.2+ features: using keyword, stable decorators, import type behavior, satisfies with generics. Load when using modern language features.
[🌳 Decision Trees](./references/decision trees.md) Clear decision frameworks for type vs interface , generics vs unions, unknown vs any , validation library selection, type narrowing strategies, and module resolution. Load when making TypeScript design decisions.
[🔧 Troubleshooting](./references/troubleshooting.md) Common TypeScript errors and fixes, type inference issues, module resolution problems, tsconfig misconfigurations, build performance optimization, and type compatibility errors. Load when debugging TypeScript issues.
JavaScript / Runtime Quality Anti Patterns
The type system catches type errors, but a class of JavaScript defects is runtime/AST
level and survives into emitted JS and plain JS files. Watch for:
Loose equality ( == / != ) — coercion bugs and auth flaws; use === / !== (accept
== null only when commented as "null or undefined").
Dynamic code execution ( eval , new Function(str) , string setTimeout ) — injection
risk and unnecessary; use direct syntax.
Mutating builtins ( Object / Array / Function.prototype ) — pollutes for…in ,
breaks the whole runtime; extend or use free functions instead.
Variable shadowing , var instead of let / const , using functions before
declaration — readability and "wrong variable" bugs.
Logical OR in switch case labels ( case 1 2: only matches 1) — use stacked
case labels.
Repetitive deep member access — cache the resolved chain in a local (esp. DOM).
Non wrapped IIFEs , backslash multiline strings , new Array() — readability
and well known traps; prefer wrapped IIFEs, template literals, and array literals.
See [JS/TS Quality Anti Patterns](./references/js quality antipatterns.md) for each
defect with compliant/non compliant examples, severities, false positive filters, and the
equivalent ESLint/SonarSource rule. Derived from CAST Highlight JavaScript code quality
indicators (https://doc.casthighlight.com/), cross referenced to ESLint core rules and
SonarSource RSPEC.
Red Flags
Stop and reconsider if:
Using any instead of unknown for external data
Casting with as without runtime validation
Disabling strict mode for convenience
Using @ts ignore without clear justification
Index access without noUncheckedIndexedAccess
Integration with Other Skills
nextjs core : Type safe Server Actions and route handlers
nextjs v16 : Async API patterns and Cache Components typing
mcp builder : Zod schemas for MCP tool inputs
Related Skills
When using Core, these skills enhance your workflow:
react : TypeScript with React: component typing, hooks, generics
nextjs : TypeScript in Next.js: Server Components, Server Actions typing
drizzle : Type safe database queries with Drizzle ORM
prisma : Prisma's generated TypeScript types for database schemas
[Full documentation available in these skills if deployed in your bundle]