typescript-react-patterns — Claude Code skill: typed React
A skill with 33 TypeScript rules for React: props, hooks, events, refs, generics and context. Useful when the agent writes components and fights type errors.
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a claude-codeWhat typescript-react-patterns does
The rules sit in 7 categories ranked by priority. Component and hook typing come first, then events, refs, generics, context and utility types. Each rule has a prefix (comp-, hook-, event-, ref-, generic-, ctx-, util-) and its own file under rules/, like rules/comp-props-interface.md or rules/hook-usestate.md.
Ready-made examples are included: a button props interface with a variant union, a typed context with a null check, and a generic list component. The agent reaches for these when you ask it to write a component or fix a type error. The full compiled guide lives in AGENTS.md.
Install goes through npx skills add, which drops the skill into your platform's folder — for Claude that is ~/.claude/skills/typescript-react-patterns/SKILL.md. Nothing beyond the skill itself is needed. If your project already has its own typing conventions, they will clash with these 33 rules: the agent pulls in the skill's templates and your code style can drift.
What it helps with
- type component props without falling back to
any - fix a TypeScript error inside a hook
- give an event handler the right type
- bind a ref to a specific HTML element
- build a generic list or table component
Example prompts for the agent
- write a typed Button component with a variant union
- fix the type error in my custom useAuth hook
- make a generic List component with renderItem and keyExtractor
How to install typescript-react-patterns
1Skills CLI (Vercel)
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a claude-code2Manually: put the files in place
~/.claude/skills/typescript-react-patterns/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/typescript-react-patterns/
1Skills CLI (Vercel)
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a codex2Manually: put the files in place
.agents/skills/typescript-react-patterns/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a cursor2Manually: put the files in place
.cursor/skills/typescript-react-patterns/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install AsyrafHussin/agent-skills typescript-react-patterns2Manually: put the files in place
.github/skills/typescript-react-patterns/SKILL.md1Skills CLI (Vercel)
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a gemini-cli2Platform CLI
gemini skills install https://github.com/AsyrafHussin/agent-skills --path skills/typescript-react-patternsManually: put the files in place
.devin/skills/typescript-react-patterns/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about typescript-react-patterns
How do I install typescript-react-patterns in Claude?
Run npx skills add AsyrafHussin/agent-skills --skill typescript-react-patterns -a claude-code. The skill lands in ~/.claude/skills/typescript-react-patterns/SKILL.md.
What does typescript-react-patterns do?
It hands the agent 33 TypeScript rules for React: props, hooks, events, refs, generics, context and utility types. The agent applies them while writing components or untangling type errors.
How is it different from generic TypeScript advice?
Rules are split into files under rules/ with category prefixes, and the full guide is compiled into AGENTS.md. The agent reads the one file it needs instead of the whole document.
Source text
SKILL.md · MIT
---
name: typescript-react-patterns
description: TypeScript best practices for React development. Use when writing typed React components, hooks, events, refs, or generic components. Triggers on tasks involving TypeScript errors, type definitions, props typing, or type-safe React patterns.
license: MIT
metadata:
author: agent-skills
version: "2.0.0"
---
# TypeScript React Patterns
Type-safe React with TypeScript. Contains 33 rules across 7 categories covering component typing, hooks, event handling, refs, generics, context, and utility types.
## Metadata
- **Version:** 2.0.0
- **Rule Count:** 33 rules across 7 categories
- **License:** MIT
## When to Apply
Reference these guidelines when:
- Typing React component props
- Creating custom hooks with TypeScript
- Handling events with proper types
- Working with refs (DOM, mutable, imperative)
- Building generic, reusable components
- Setting up typed Context providers
- Fixing TypeScript errors in React code
## Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|----------|----------|--------|--------|
| 1 | Component Typing | CRITICAL | `comp-` |
| 2 | Hook Typing | CRITICAL | `hook-` |
| 3 | Event Handling | HIGH | `event-` |
| 4 | Ref Typing | HIGH | `ref-` |
| 5 | Generic Components | MEDIUM | `generic-` |
| 6 | Context & State | MEDIUM | `ctx-` |
| 7 | Utility Types | LOW | `util-` |
## Quick Reference
### 1. Component Typing (CRITICAL)
- `comp-props-interface` - Use interface for props, type for unions
- `comp-children-types` - Correct children typing (ReactNode, ReactElement)
- `comp-default-props` - Default props with destructuring defaults
- `comp-forward-ref` - Typing forwardRef components
- `comp-polymorphic` - Polymorphic "as" prop typing
- `comp-fc-vs-function` - Function declaration vs React.FC
- `comp-display-name` - Display names for debugging
- `comp-rest-props` - Spreading rest props with proper types
### 2. Hook Typing (CRITICAL)
- `hook-usestate` - useState with proper generic types
- `hook-useref` - useRef for DOM elements and mutable values
- `hook-use-reducer` - useReducer with discriminated union actions
- `hook-use-callback` - useCallback with typed parameters
- `hook-use-memo` - useMemo with typed return values
- `hook-use-context` - useContext with null checking
- `hook-custom-hooks` - Custom hook return types
- `hook-generic-hooks` - Generic custom hooks
### 3. Event Handling (HIGH)
- `event-handler-types` - Event handler type patterns
- `event-click-handler` - Click event typing
- `event-form` - Form event handling (submit, change, select)
- `event-keyboard` - Keyboard event types
### 4. Ref Typing (HIGH)
- `ref-dom-elements` - useRef with specific HTML element types
- `ref-callback` - Callback ref pattern for DOM measurement
- `ref-imperative-handle` - useImperativeHandle typing
### 5. Generic Components (MEDIUM)
- `generic-list` - Generic list components
- `generic-select` - Generic select/dropdown
- `generic-table` - Generic table with typed columns
- `generic-constraints` - Generic constraints with extends
### 6. Context & State (MEDIUM)
- `ctx-create` - Creating typed context
- `ctx-provider` - Provider pattern with null check hook
- `ctx-reducer` - Context with useReducer
### 7. Utility Types (LOW)
- `util-component-props` - ComponentPropsWithoutRef for HTML props
- `util-pick-omit` - Pick, Omit, Partial for prop derivation
- `util-discriminated-unions` - Discriminated unions for state machines
## Essential Patterns
### Component Props
```tsx
interface ButtonProps {
variant: 'primary' | 'secondary' | 'danger'
size?: 'sm' | 'md' | 'lg'
children: React.ReactNode
onClick?: () => void
}
function Button({ variant, size = 'md', children, onClick }: ButtonProps) {
return (
<button className={`btn-${variant} btn-${size}`} onClick={onClick}>
{children}
</button>
)
}
```
### Typed Context with Null Check
```tsx
interface AuthContextType {
user: User | null
login: (credentials: Credentials) => Promise<void>
logout: () => void
}
const AuthContext = createContext<AuthContextType | null>(null)
function useAuth() {
const context = useContext(AuthContext)
if (!context) throw new Error('useAuth must be used within AuthProvider')
return context
}
```
### Generic Component
```tsx
interface ListProps<T> {
items: T[]
renderItem: (item: T) => React.ReactNode
keyExtractor: (item: T) => string
}
function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
return <ul>{items.map(item => <li key={keyExtractor(item)}>{renderItem(item)}</li>)}</ul>
}
```
## How to Use
Read individual rule files for detailed explanations:
```
rules/comp-props-interface.md
rules/hook-usestate.md
rules/event-form.md
rules/ref-dom-elements.md
rules/util-discriminated-unions.md
```
## References
- [React TypeScript Cheatsheet](https://react-typescript-cheatsheet.netlify.app)
- [React + TypeScript Guide](https://react.dev/learn/typescript)
- [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/)
## Full Compiled Document
For the complete guide with all rules expanded: `AGENTS.md`
© agent-skills · MIT · AsyrafHussin/agent-skills