Typescript React Reviewer

作者 dotneet07fa7eac95c2无许可证3 个星标收录于 2026年10月8日更新于 2026年10月8日仓库8个月前更新

Expert code reviewer for TypeScript + React 19 applications. Use when reviewing React code, identifying anti-patterns, evaluating state management, or assessing code maintainability. Triggers: code review requests, PR reviews, React architecture evaluation, identifying code smells, TypeScript type safety checks, useEffect abuse detection, state management review.

AI 生成的概览

审查 TypeScript 与 React 19 代码,指出反模式、Hook 误用、状态管理问题与类型安全问题。

功能
提供面向 TypeScript 与 React 19 应用的结构化代码审查指南,按优先级分级,从阻断合并的严重问题到架构与风格建议。其中列出 useEffect 滥用、React 19 Hook 错误、状态直接修改、TypeScript 危险信号以及状态管理反模式的检测模式,并给出错误与正确写法示例。它还定义了审查流程,并指向随附的参考文档,涵盖 React 19 模式、反模式目录和完整审查清单。
适用场景
适用于审查 React 或 TypeScript 的拉取请求、评估组件架构,或检查 Hook 用法与类型安全。也适合识别代码坏味道、评估可维护性,或审查 React 19 代码库中的状态管理方案。
运行要求
无需脚本或工具,仅为说明性内容。它引用了 references 目录下的三份随附 Markdown 文档。

TypeScript + React 19 Code Review Expert

Expert code reviewer with deep knowledge of React 19's new features, TypeScript best practices, state management patterns, and common anti-patterns.

Review Priority Levels

🚫 Critical (Block Merge)

These issues cause bugs, memory leaks, or architectural problems:

IssueWhy It's Critical
useEffect for derived stateExtra render cycle, sync bugs
Missing cleanup in useEffectMemory leaks
Direct state mutation (.push(), .splice())Silent update failures
Conditional hook callsBreaks Rules of Hooks
key={index} in dynamic listsState corruption on reorder
any type without justificationType safety bypass
useFormStatus in same component as <form>Always returns false (React 19 bug)
Promise created inside render with use()Infinite loop

⚠️ High Priority

IssueImpact
Incomplete dependency arraysStale closures, missing updates
Props typed as anyRuntime errors
Unjustified useMemo/useCallbackUnnecessary complexity
Missing Error BoundariesPoor error UX
Controlled input initialized with undefinedReact warning

📝 Architecture/Style

IssueRecommendation
Component > 300 linesSplit into smaller components
Prop drilling > 2-3 levelsUse composition or context
State far from usageColocate state
Custom hooks without use prefixFollow naming convention

Quick Detection Patterns

useEffect Abuse (Most Common Anti-Pattern)

typescript
// ❌ WRONG: Derived state in useEffectconst [firstName, setFirstName] = useState('');const [fullName, setFullName] = useState('');useEffect(() => {  setFullName(firstName + ' ' + lastName);}, [firstName, lastName]);
// ✅ CORRECT: Compute during renderconst fullName = firstName + ' ' + lastName;
typescript
// ❌ WRONG: Event logic in useEffectuseEffect(() => {  if (product.isInCart) showNotification('Added!');}, [product]);
// ✅ CORRECT: Logic in event handlerfunction handleAddToCart() {  addToCart(product);  showNotification('Added!');}

React 19 Hook Mistakes

typescript
// ❌ WRONG: useFormStatus in form component (always returns false)function Form() {  const { pending } = useFormStatus();  return <form action={submit}><button disabled={pending}>Send</button></form>;}
// ✅ CORRECT: useFormStatus in child componentfunction SubmitButton() {  const { pending } = useFormStatus();  return <button type="submit" disabled={pending}>Send</button>;}function Form() {  return <form action={submit}><SubmitButton /></form>;}
typescript
// ❌ WRONG: Promise created in render (infinite loop)function Component() {  const data = use(fetch('/api/data')); // New promise every render!}
// ✅ CORRECT: Promise from props or statefunction Component({ dataPromise }: { dataPromise: Promise<Data> }) {  const data = use(dataPromise);}

State Mutation Detection

typescript
// ❌ WRONG: Mutations (no re-render)items.push(newItem);setItems(items);
arr[i] = newValue;setArr(arr);
// ✅ CORRECT: Immutable updatessetItems([...items, newItem]);setArr(arr.map((x, idx) => idx === i ? newValue : x));

TypeScript Red Flags

typescript
// ❌ Red flags to catchconst data: any = response;           // Unsafe anyconst items = arr[10];                // Missing undefined checkconst App: React.FC<Props> = () => {}; // Discouraged pattern
// ✅ Preferred patternsconst data: ResponseType = response;const items = arr[10]; // with noUncheckedIndexedAccessconst App = ({ prop }: Props) => {};  // Explicit props

Review Workflow

  1. Scan for critical issues first - Check for the patterns in "Critical (Block Merge)" section
  2. Check React 19 usage - See react19-patterns.md [blocked] for new API patterns
  3. Evaluate state management - Is state colocated? Server state vs client state separation?
  4. Assess TypeScript safety - Generic components, discriminated unions, strict config
  5. Review for maintainability - Component size, hook design, folder structure

Reference Documents

For detailed patterns and examples:

  • react19-patterns.md [blocked] - React 19 new hooks (useActionState, useOptimistic, use), Server/Client Component boundaries
  • antipatterns.md [blocked] - Comprehensive anti-pattern catalog with fixes
  • checklist.md [blocked] - Full code review checklist for thorough reviews

State Management Quick Guide

Data TypeSolution
Server/async dataTanStack Query (never copy to local state)
Simple global UI stateZustand (~1KB, no Provider)
Fine-grained derived stateJotai (~2.4KB)
Component-local stateuseState/useReducer
Form stateReact 19 useActionState

TanStack Query Anti-Pattern

typescript
// ❌ NEVER copy server data to local stateconst { data } = useQuery({ queryKey: ['todos'], queryFn: fetchTodos });const [todos, setTodos] = useState([]);useEffect(() => setTodos(data), [data]);
// ✅ Query IS the source of truthconst { data: todos } = useQuery({ queryKey: ['todos'], queryFn: fetchTodos });

TypeScript Config Recommendations

json
{  "compilerOptions": {    "strict": true,    "noUncheckedIndexedAccess": true,    "noImplicitReturns": true,    "exactOptionalPropertyTypes": true  }}

noUncheckedIndexedAccess is critical - it catches arr[i] returning undefined.

Immediate Red Flags

When reviewing, flag these immediately:

PatternProblemFix
eslint-disable react-hooks/exhaustive-depsHides stale closure bugsRefactor logic
Component defined inside componentRemounts every renderMove outside
useState(undefined) for inputsUncontrolled warningUse empty string
React.FC with genericsGeneric inference breaksUse explicit props
Barrel files (index.ts) in app codeBundle bloat, circular depsDirect imports

来源与署名

来源:dotneet/claude-code-marketplace位于review-tool/skills/typescript-react-reviewer提交07fa7ea

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架