Skip to content

drillDown 是 objectui 读的活能力,却不是 spec 声明的任何键 —— #3752 的迁移处方曾指向它 #5022

Description

@xuyushun441-sys

#4001 批 15 中分离出来,未指派。批 15 已就地修正了错误的处方文本(否则会把它提升成一条带平台权威的报错),但底下的缺口是独立的一件事。

发现

packages/spec/src/ui/chart.zod.ts#3752 写下的迁移说明是:

clickAction — … Migration: drillDown, or handle it in React.

批 15 要把这句话提升进 ChartInteractionSchema 的 strict 拒绝信息时,先按惯例核了处方指向的键是否存在。不存在:

  • grep -rn "drillDown" packages/spec/src/ui/*.zod.ts → 只有这段注释本身;
  • DashboardWidgetSchema 没有任何 drill 相关键;
  • ReportSchema 有的是 drilldown(全小写,ADR-0021 D2,布尔,默认 true);
  • objectui 侧则是 packages/plugin-charts/src/ObjectChart.tsx:602const drillDown = (schema as any).drillDown; —— 一个未类型化的读取,后面真的驱动了 drill drawer、computeDrillFilterdrillDown.target / .maxRows / .columns

即:渲染器实现了一套 drill 配置,协议里没有它的声明,而 spec 的注释在教作者写它。

为什么这是个问题,而不只是注释错字

如果批 15 照抄那句话,一个把 clickAction 改对的作者会被告知写 drillDown,然后被同一个刚加上的闸门再拒一次 —— 账本记过两次的 finding 7(「本战役自己的修复,给人指向了它本要消灭的失效模式」)的第三次。批 15 因此把处方改成只点名确实存在的东西(onSegmentClick / ReportSchema.drilldown / dashboard widget 的 options 袋),并留了一条测试钉死「永不出现 drillDown」。

但那只是让错误信息不再说谎。真实缺口仍在:

  1. drillDown 走的是 options(DashboardWidgetOptionsSchema,故意 passthrough)还是别处?今天没有声明,所以两种写法都「能跑」,取决于渲染器拿到的扁平化 schema 长什么样 —— 这是 Prime Directive chore: version packages #10 的 declared ≠ delivered,方向相反的一种:delivered 但 never declared。
  2. ReportSchema.drilldown 与 objectui 的 drillDown 拼写不同、语义不同(前者是布尔开关,后者是 { target, maxRows, columns, mode } 配置对象),名字却几乎一样。这正是本战役反复付学费的那类近似键。

建议

按 contract-first 择一:

  • 声明它 —— 给 chart drill 配置一个 Zod 形状({ enabled, mode, target, maxRows, columns },从 ObjectChart.tsx 的实际读取点反推),挂在 widget options 或 chart config 上,再让渲染器读声明后的键;顺便决定与 ReportSchema.drilldown 的关系(是否统一拼写)。
  • 或明确它是渲染器私有 —— 那就在 DashboardWidgetOptionsSchema 的文档里点名 drillDown 属于「渲染器自有、协议不建模」的那一类(该 schema 已有这段话,只是没列它),并保持 (schema as any) 的读取方式,但不要在 spec 注释里把它当作可授权键推荐。

参考

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions