| name | typescript |
| description | Write type-safe TypeScript. Use when writing or reviewing TypeScript code. Covers type safety best practices, avoiding dangerous features (any/as), and proper narrowing techniques. |
TypeScript
Checklist
- No
any- Useunknownand validate with valibot - No
as- Fix types at source - No
!- Explicit checks instead - NO
value is T- Use a validator library like valibot instead - Discriminated unions - Add
typefield to narrow
Good Practices
as const- For literal types onlyvalue satisfies T- Type-checks value without changing its type (safe, unlikeis T)- Builtin narrowing -
typeof,Array.isArray,in,instanceofare always safe T extends SomeTypeif T is required to have some traitfoo?.bar- Use?.for safe property access- Tagged unions -
type User = { role: "admin"; permissions: string[] } | { role: "guest"; expiresAt: Date }then narrow withif (user.role === "admin") - When refactoring - Fix ONE type error at a time (type inference changes)
- Const string unions -
type Status = "pending" | "active" | "done"instead of enums
When Stuck - NEVER Give Up
IMPORTANT: Every time you encounter a type error, repeat this checklist in your response before attempting a fix.
When you're stuck and considering any or as, STOP:
- Read the library's documentation - Most type issues come from misunderstanding the library API
- Search GitHub issues (library repo) - Someone likely faced the same problem
- Read error message more carefully
- Use valibot to validate (if the type is unknown at runtime)
- Ask the user
any and as are admitting defeat. Always use choose another method.