
为什么你的 React 组件 prop 类型太宽HumanLayer Skills 教你精准收窄【免费下载链接】skills项目地址: https://gitcode.com/GitHub_Trending/skills53/skills如果你的 React 组件挂着一大堆可选 prop真实业务里却只传其中几个问题往往不在业务逻辑而在类型太宽了。HumanLayer Skills 开源技能合集里的narrow-react-prop-types技能正是为这个痛点而生它教会 AI 编码助手识别活代码的真实调用路径把 React 组件 prop 类型收窄到与实际行为一致而不是被 Storybook、测试和 mock 数据牵着走。本文带你搞懂 prop 类型为什么会变宽、如何一键安装以及它的完整工作流程。什么是prop 类型过宽想象一个卡片组件的 props 定义// 过宽的类型允许了真实代码根本不会进入的状态 interface CardProps { title: string items?: string[] // 活代码里其实永远有值 onAction?: () void // 菜单项常显却允许不传回调 defaultItems?: string[] // 只为 Storybook 演示服务 }类型里每多一个可选字段组件就多一种理论上合法、实际上不存在的状态。于是你被迫写items ?? []、onAction?.(...)这类防御代码还要为这些假状态补测试——类型越宽组件要处理、要测试、要保持正确的分支就越多。narrow-react-prop-types 做的事情就是把类型拉回到组件在真实产品里的行为契约。为什么 prop 类型会越写越宽3 个常见诱因诱因现象后果 Storybook 演示为了让某个 story 能单独跑把 prop 改成可选类型被演示需求绑架 测试 / mock 数据测试里懒得传全量 prop就放宽成可选类型迁就测试而非真实行为 demo 专用字段defaultFoo、备用回调形态、展示开关活代码永远用不到却永久留在类型里关键在于活代码路径应用路由、已接线的组件、Provider、Hook、生产包的导出才是 prop 契约的唯一事实来源Story、测试、fixture、demo 只是支撑代码只能作为类型被放宽的佐证不能证明某个状态真实存在。认识 HumanLayer SkillsAI 编码助手的开源技能合集HumanLayer Skills 是一组面向 AI 编码助手如 Claude Code的可安装技能。每个技能是一份教程式的SKILL.md把一项专业判断沉淀下来让 AI 助手在无人值守时也能按专家套路干活。除了本文主角合集里还包含improve-claude-md用important if块重写 CLAUDE.md提升指令遵循度design-control-loop通过访谈帮你设计并搭建传感-控制-执行的代理控制循环show-me用简洁的图、代码草图和 HTML 制品可视化讲解当前话题技能清单见项目入口文件 README.md。一键安装 narrow-react-prop-types 技能安装非常简单在项目里执行npx skills add humanlayer/skills --skill narrow-react-prop-types然后在你的项目里直接调用/narrow-react-prop-types如果团队想先通读技能的完整判断逻辑再决定怎么落地可以直接打开技能定义文件 SKILL.md。完整工作流程11 步精准收窄 prop 类型这个技能的工作流程是一条严谨的流水线下面按步骤拆解完整版见 SKILL.md定位可疑组件找那些 prop 接口很大、一堆可选字段、存在onSelect?.()、items ?? []这类回退写法的组件。⚠️ 不要只凭一个 story 或测试就选定目标。找到所有活代码调用点搜索该组件、其导出的 prop 类型、以及共享子组件的所有导入与用法并区分活代码与支撑代码。从活代码推导真实类型每个 prop 归入三类——Required所有非测试/非 Story 调用点都传、Optional确有调用点省略它且省略是真实运行时状态、Removed活代码从不用。收紧公开 prop 类型只保留活代码里真实出现过的状态。推导并抽取类型优先用Parameters、ReturnType、Extract从现有 API 推导而不是手写重复。同步收紧内部子组件 props父组件收紧后把传给 row/menu/button 等子组件的可选回调也改成必传。删除只为过宽类型而存在的回退逻辑例如new Set(expandedIds ?? defaultExpandedIds ?? [])可以简化为new Set(expandedIds)。更新所有共享该类型的变体多个组件共用同一宽类型时一起改保持一致契约。让测试和 story 适配活代码收窄后 story/测试报错就给它们补真实的 handler 和状态而不是把 prop 再放宽。校验改动对改动涉及的包及所有使用它的活应用/包跑类型检查。按模板格式化响应作为 CI 代理时最终输出会成为 PR 描述格式见 response-template.md。 一句话总结这套流程先证明活代码长什么样再让类型去贴合它反过来而不是去迁就 story 和测试。收窄原则活代码路径是类型契约的唯一事实来源技能定义里反复强调了几条铁律理解了它们你就抓住了收窄的本质改类型前先找到真实的非测试、非 Storybook 调用点。活代码路径是 prop 契约的唯一事实来源。不要仅仅因为可选 prop 方便了 Storybook/测试/mock就保留它。类型越严格代码可以越简单——用严格类型防止不可能的状态而不是用宽类型逼出防御性渲染逻辑。可空性与可选性不同活代码总是传值、但值可能为空时用必传可空如focusedItem: FocusedItem | null优于可选focusedItem?: FocusedItem | null。6 个必须避开的 prop 类型反模式技能文档专门列了Anti-Patterns to Avoid新手最容易踩这些坑❌ 为了让 story 省略回调把回调改成可选❌ 渲染一个会调用onAction?.(...)的菜单项可能是点了没反应的死按钮❌ 给 Storybook 加default*prop而活代码其实是受控的❌ 用?? []或?? 0掩盖本应必传的活代码状态❌ 活代码只用一种 API 形态却接受多种形态❌ 把纯组件当mock 组件放松它的契约✅ 正确姿势如果组件总是渲染某个交互入口那就要求让它可以工作的 handler绝不允许看得见但点了没反应的惰性状态存在。进阶玩法把 prop 收窄接入 CI 自动化循环这个技能不止能手动跑还能变成一个定期自动执行的代理工作流定时建分支、跑收窄、开 PR还支持维护者用/iterate在 PR 上留言让代理自我迭代。相关的参考模板都在 references 目录 下agent-narrow-component-props.yml一个可复用的 GitHub Actions 工作流示例含定时/手动两种模式和/iterate迭代机制narrow-component-props-memory.md跨运行保留的代理记忆文件存放长期反馈与范围排除项response-template.md代理最终输出即 PR 描述的标准格式包含变更表格、活代码调用点、校验结果与风险评估这套技能 工作流 记忆文件的组合正是 HumanLayer Skills 想推广的思路把专家判断固化成可复用、可自动化的技能。如果你想从零设计自己的控制循环可以参考 design-control-loop 技能。相关模块路径速查模块路径作用项目入口README.md技能清单与安装方式核心技能定义SKILL.md11 步工作流程 原则 反模式CI 响应模板response-template.mdPR 描述标准格式自动化工作流agent-narrow-component-props.yml定时收窄 /iterate代理记忆文件narrow-component-props-memory.md跨运行长期反馈常见问题 FAQQ1收窄 prop 类型会不会破坏线上功能不会。收窄的前提是活代码本来就只传这些所以是让类型贴合已有行为而非改变行为。真正的风险来自没找到某个活代码调用点所以流程要求先搜遍所有调用点再动手。Q2我的组件没有 Storybook / 测试能用吗能而且更简单。活代码就是唯一的调用点来源直接按所有调用点都传 → 必传处理即可。Q3收窄后测试 / story 报错怎么办补真实的 handler 和状态或抽一个测试辅助函数满足严格契约——不要把 prop 再放宽来迁就测试。Q4这个技能和 improve-claude-md 有什么区别narrow-react-prop-types 专注 React 类型收窄improve-claude-md 则是优化 CLAUDE.md 让 AI 更好遵循指令两者面向不同问题可搭配使用。总结让类型回到真实行为过宽的 prop 类型是演示友好的代价却悄悄给组件堆上了假状态、防御代码和多余测试。HumanLayer Skills 的narrow-react-prop-types技能把以活代码为唯一事实来源这条原则固化成了一套可手动执行、也可自动化的 11 步流程。 核心记忆点先证明活代码长什么样再让类型去贴合它——用严格类型防止不可能的状态而不是用宽类型逼出防御逻辑。装上它让 React 组件的 prop 类型终于和你的真实业务行为对齐。【免费下载链接】skills项目地址: https://gitcode.com/GitHub_Trending/skills53/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考