Components
- Use function components with typed props.
- Prefer
React.FConly when children typing is needed; otherwise avoid. - Memoize when beneficial (
React.memo,useMemo,useCallback).
Props & State
- Type props with interfaces or type aliases (PascalCase).
- Use
readonlyfor immutable props/state shapes. - Avoid
any; useunknownwhen necessary. - Prefer discriminated unions for state machines.
Hooks
- Extract logic into custom hooks.
- Type hook return values explicitly.
- Avoid unnecessary dependencies in hook arrays.
Data & Types
- Store types in
types.tsfiles. - Use Zod for runtime validation.
Imports & Exports
- Prefer named imports and named exports.
- Always declare imports at the beginning of source files.
- Import order:
- External libs
- Internal modules
- Types
- Avoid default exports.
Error Handling
- Use custom error classes with
codeand optional context. - Prefer
Result<T, E>patterns for recoverable failures.
Async Patterns
- Use
async/await. - Wrap async code with
try/catch. - Avoid inline Promises inside JSX.
Performance
- Use
as constfor literals. - Use mapped types for transformations.
- Use memoization and stable references to reduce re-renders.