react-ddt 是 React dont-do-that packaging,用于约束 React 组件和 hook 中常见的职责放置错误:把与 React state 无关的纯函数、静态常量和类型定义耦合在 .tsx 或 hook 主文件里。它与 ddt 互补,ddt 反对无收益的过度封装,react-ddt 负责把 React 文件里的非 React 职责放到项目约定位置。
触发场景包括:review React hook、组件或 .tsx 文件结构;指出纯函数不应放在组件或 hook 主文件;要求把常量放到 enum.ts、把类型移出主文件并按项目规范放置;复查改动的 TS/TSX 文件目录职责。
核心规则:组件文件只保留渲染、props 解构、hook 调用、事件 handler 及与 state/ref/effect 强绑定的逻辑;hook 主文件只保留自身 state、ref、memo、effect、callback 编排。与 React 生命周期无关的纯函数抽到当前目录 util.ts,静态常量抽到 enum.ts,类型先判断是否应移出,再按项目类型规范决定落点,不能一刀切新建 types.ts。
执行前必须先读取仓库内 CLAUDE.md 和存在的 AGENTS.md,再按需读取模块文档和源码旁说明。审查时先列出被改动的 React hook、组件和 .tsx 文件,逐个检查顶层 const、function、type、interface,判断是否属于 React 主流程及拆分是否有真实收益。移动后更新 import,合并重复导入,类型导入用 import type,检查循环引用和注释,最后运行最小必要验证,默认至少对受影响文件跑 ESLint,再按影响补 npm run check-types、npm run verify:i18n 或页面手动验证。
限制:不鼓励新增无收益的中间层;单次使用、2 到 5 行、只是简单映射或包装的薄 helper 应内联;只服务一个父类型的薄类型应合并;状态已由 React 生命周期或类型保证时不要重复兜底。回复需说明验证结果,未跑浏览器手动验证要明确说明,不要把 ESLint warning 说成错误。