真实项目升级反馈:该规则 18 处命中里约 16 处是纯数据函数误报,而它是 error,
升级期变成打地鼠。两类误报源都在代码里确认了:
1. `return cond && value` —— 对**任何** `return &&` 无条件报,完全不看右值是什么
2. `return x ? x : null` —— 只看分支是不是空,不看返回值是不是**渲染节点**,
于是 `T | null` 这种正常的空值建模全被报成「组件顶层条件 return」
立论只在「返回值会被渲染」时成立:组件 run-once 导致那个 return 永不重算;
**纯数据函数每次调用都执行**,条件 return 完全正常。
收窄:三分支里至少一个是 JSX 渲染节点时才报,且只认 JSX 语法(不猜
`createElement(...)` 的调用结果 ——「漏报一个调用形态」比「误报一片数据函数」
代价小得多)。
降级为 warning:立论依赖「这个函数是组件」,而静态分析**判不出来**(返回 JSX 的
箭头函数既可能是组件、也可能是渲染期调用的辅助函数)。对无法静态判定的谓词不该
有挡构建的强度 —— 与 `VOBS_C105` 同一处理。真正会坏的东西由运行时护栏
(`pnpm run check:runtime`)精确抓到。
同时修 fix 文案:1.8.0 推荐的 `class={cond ? 'is-on' : 'is-off'}` 依赖一个**全局**
`.is-off` 工具类,而真实项目只有组合选择器(`.seq-param-group.is-off`),照着改会
得到「类名加上了但样式不生效」。改为指向 1.8.0 新增的 `Show` / `classList`。
验证:
- 新增 `c104-scope.test.ts`(15 例)—— 覆盖报告里的 7 个误报形态(`T | null` 建模、
`a && b`、`list.length && list[0]`、单表达式箭头、if 早退、Boolean 包裹、数据三元)
与 3 个该报形态(`cond && <A/>`、`?: <A/> : null`、`?: null : <B/>`)
- 另用 9 条真实形态探针实测 **9/9 正确**
- 既有 `toplevel-conditional-return.test.ts` 的 severity 断言随刻意降级而改(附理由)
- 构建产物复验:纯数据误报 0、组件形态 severity = warning
全量门禁 **1333 测试** 全绿 · typecheck 0 · check:source 0。