typescript-react-reviewer
1
总安装量
1
周安装量
#49896
全站排名
安装命令
npx skills add https://github.com/lqsyyy/yach-skills --skill typescript-react-reviewer
Agent 安装分布
amp
1
opencode
1
cursor
1
kimi-cli
1
codex
1
github-copilot
1
Skill 文档
TypeScript + React 17 Code Review Expert
Expert code reviewer with deep knowledge of React 17, Redux, Redux-Saga, Ant Design 4, and TypeScript best practices.
Review Priority Levels
ð« Critical (Block Merge)
These issues cause bugs, memory leaks, or architectural problems:
| Issue | Why It’s Critical |
|---|---|
useEffect for derived state |
Extra render cycle, sync bugs |
Missing cleanup in useEffect |
Memory leaks (timers, event listeners) |
Direct state mutation (.push(), .splice()) |
Silent update failures (React/Redux) |
| Conditional hook calls | Breaks Rules of Hooks |
key={index} in dynamic lists |
State corruption on reorder |
any type without justification |
Type safety bypass |
Missing yield in Sagas |
Saga won’t wait for effect, logic breaks |
| Blocking effects in Sagas | call or take blocking other loops unnecessarily |
| Illegal dependency | _public, pages, plugins importing from im |
Missing try-catch |
Critical in Sagas, JSON parsing, and async IO |
â ï¸ High Priority
| Issue | Impact |
|---|---|
| Incomplete dependency arrays | Stale closures, missing updates |
Props typed as any |
Runtime errors |
Unjustified useMemo/useCallback |
Unnecessary complexity |
| Missing Error Boundaries | Poor error UX |
Controlled input initialized with undefined |
React warning |
| Missing error handling in Sagas | Crashes the generator/application |
ð Architecture/Style
| Issue | Recommendation |
|---|---|
| Component > 300 lines | Split into smaller components |
| Prop drilling > 2-3 levels | Use composition or Redux |
| State far from usage | Colocate state |
Custom hooks without use prefix |
Follow naming convention |
| Hardcoded constants | Use config files or constants.ts |
Quick Detection Patterns
useEffect Abuse (Most Common Anti-Pattern)
// â WRONG: Derived state in useEffect
const [firstName, setFirstName] = useState('');
const [fullName, setFullName] = useState('');
useEffect(() => {
setFullName(firstName + ' ' + lastName);
}, [firstName, lastName]);
// â
CORRECT: Compute during render
const fullName = firstName + ' ' + lastName;
// â WRONG: Event logic in useEffect
useEffect(() => {
if (product.isInCart) showNotification('Added!');
}, [product]);
// â
CORRECT: Logic in event handler
function handleAddToCart() {
addToCart(product);
showNotification('Added!');
}
Redux + Saga Patterns
// â WRONG: Missing error handling in Saga (Critical)
function* fetchDataSaga(action) {
const data = yield call(api.fetchData, action.payload);
yield put(actions.fetchSuccess(data));
}
// â
CORRECT (Mandatory): Try-catch in Saga
function* fetchDataSaga(action) {
try {
const data = yield call(api.fetchData, action.payload);
yield put(actions.fetchSuccess(data));
} catch (error) {
yield put(actions.fetchFailure(error));
}
}
TypeScript Red Flags
// â Red flags to catch
const data: any = response; // Unsafe any
const items = arr[10]; // Missing undefined check
const App: React.FC<Props> = () => {}; // Discouraged pattern
// â
Preferred patterns
const data: ResponseType = response;
const items = arr[10]; // with noUncheckedIndexedAccess
const App = ({ prop }: Props) => {}; // Explicit props
Review Workflow
- Scan for critical issues first – Check for the patterns in “Critical (Block Merge)” section
- Evaluate Redux/Saga usage – Check for proper effect usage and error handling in Sagas
- Assess ahooks usage – Check if
ahooks(useMount, useUnmount, etc.) are used for readability - Assess TypeScript safety – Generic components, discriminated unions, strict config
- Review for maintainability – Component size, hook design, folder structure
Reference Documents
For detailed patterns and examples:
- redux-saga-patterns.md – Best practices for Redux-Saga effects and flows
- antd-v4-patterns.md – Ant Design 4 component usage and Form/Table best practices
- electron-patterns.md – Electron IPC, cleanup, and native integration
- antipatterns.md – Comprehensive anti-pattern catalog with fixes
- checklist.md – Full code review checklist for thorough reviews
State Management Quick Guide
| Data Type | Solution |
|---|---|
| Persistent Server Data | Redux + Redux-Saga |
| Cache/Fetching | TanStack Query (v4) |
| UI/Complex Global State | Redux |
| Component-local state | useState/useReducer |
| Performance Helpers | ahooks (useLatest, useUpdateEffect) |
Specialized Review Rules
1. Localization (i18n)
Avoid hardcoded Chinese/English strings in JSX.
- Wrong:
<span>ç¡®å®</span> - Correct:
<span>{util.locale('common_ok')}</span>
2. Electron Cleanup
Always verify that IPC listeners and DOM event listeners have corresponding cleanup logic.
Redux Mutation Anti-Pattern
// â NEVER mutate state in Reducers
case 'ADD_TODO':
state.todos.push(action.payload);
return state;
// â
Redux Toolkit or Immutable updates
case 'ADD_TODO':
return { ...state, todos: [...state.todos, action.payload] };
TypeScript Config Recommendations
{
"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:
| Pattern | Problem | Fix |
|---|---|---|
eslint-disable react-hooks/exhaustive-deps |
Hides stale closure bugs | Refactor logic |
| Component defined inside component | Remounts every render | Move outside |
useState(undefined) for inputs |
Uncontrolled warning | Use empty string |
React.FC with generics |
Generic inference breaks | Use explicit props |
Large Saga without takeLatest |
Race conditions / Performance | Use takeLatest or takeEvery correctly |