--- name: react-typescript description: Type React components and hooks with TypeScript patterns. Use when typing React props, hooks, event handlers, or component generics in TypeScript. metadata: triggers: files: - '**/*.tsx' keywords: - ReactNode - FC - PropsWithChildren - ComponentProps - react typescript - tsx types - props interface - generic component - useState type - useRef type - typed hooks --- # React TypeScript ## **Priority: P1 (HIGH)** ## Implementation Guidelines - **Components**: Prefer **interface/type (`Props`)** over **`React.FC`** (which implicit children). Use **`JSX.Element`** or **`ReactNode`** as return type. - **Children**: For components that accept children, use **`PropsWithChildren`** or explicitly type them as **`React.ReactNode`**. - **Events**: Always type event handlers using specific React events, such as **`React.ChangeEvent`** or **`React.FormEvent`**. - **Hooks**: For `useRef`, avoid `any`; use **`useRef(null)`**. For `useState`, use generics for complex types: **`useState(null)`**. - **Native Elements**: Use **`ComponentPropsWithoutRef<'button'>`** or **`ComponentPropsWithRef`** to extend native attributes safely. - **Generics**: Implement generic components for reusable UI like lists using **`(props: ListProps)`**. - **Discriminated Unions**: Use **Discriminated Unions** for mutually exclusive props (e.g., `success` vs `error` states). - **Utility Types**: Leverage **`Omit`**, **`Pick`**, and **`Partial`** to transform prop interfaces and avoid redundancy. ## Anti-Patterns - **No `any`**: Use `unknown`. - **No `React.FC`**: Implicit children deprecated/bad practice. - **No `Function`**: Use `(args: T) => void`. ## References See [references/example.md](references/example.md) for typed props, generic components, and hook ref patterns. ## Canonical response anchors When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant: - generic