Skip to content

plugin-dashboard README 的 onSchemaChange 示例把 string | undefined 传给 saveItem 的必填 name —— 照抄在 TS 消费者那里是 TS2345 #5066

Description

@yinlianghui

发现于 #5015 的实施(编译探针跑全 README 时,这一块在改前改后都红,与本卡所改两处无关)。Filed unassigned, not claiming。与 #5015 不同性质:名字与键全真,错的是可选性,所以按纪律另立而不夹带。

现象

packages/plugin-dashboard/README.md:416-422(改前行号;#5015 的 PR 只动 TypeScript 一节,不影响这一段的内容):

< DashboardGridLayout
  schema={dashboard}
  // ✅ Preferred — write the updated schema through your data adapter.
  onSchemaChange={(next) => client.meta.saveItem('dashboard', next.name, next)}
/ >

三条读数对不上:

  1. onSchemaChange?: (schema: DashboardComponentSchema) = > void —— packages/plugin-dashboard/src/DashboardGridLayout.tsx:84。所以 next 是 DashboardComponentSchema。
  2. DashboardComponentSchema extends BaseSchema,而 name?: string —— packages/types/src/base.ts:86。所以 next.name 的类型是 string | undefined。
  3. saveItem: (type: string, name: string, item: any) = > Promise< SaveMetaItemResponse > —— @objectstack/client@17.0.0 的 dist/*.d.ts:714(同一签名在 :2980 再现)。name 必填且不接受 undefined。

读者照抄,在 strict 下直接红:

error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

这条是 #5015 的编译探针跑全 README 时唯一剩下的诊断(改前 3 条:两条 TS2305 是 #5015 所修,这一条改前改后原样携带)。探针把 dashboard / client 声明成中性形状,saveItem 按上面第 3 条的真签名写,所以红的是这个块本身,不是探针的假设。

为什么值得单独一卡

散文把这一段标成 ✅ Preferred —— 它是这个 README 里唯一被推荐的持久化写法,而且紧跟着一段强调「persistence is the parent's concern」的规则说明。也就是说这是本页最可能被整段抄走的片段。

运行时后果比类型面更值得看一眼:name 真的缺省时(DashboardComponentSchema.name 是可选的,Studio 设计器产出的 SDUI 节点就可以不带),saveItem('dashboard', undefined, next) 会以 undefined 作为元数据 item 名去写 —— 本单没有跑到服务端确认它是 400 还是写出一条名为 "undefined" 的记录,如实标注为未量。

修法(仅供分诊参考,未代裁)

最小改法是让示例把缺名这件事显式处理掉,而不是让读者以为 next.name 一定有值,例如把它收窄后再写、或在示例里明确 dashboard 节点带 name。但这牵涉一个契约问题:一个 SDUI dashboard 组件节点到底该不该有 name(#4600 正在等 objectstack#8593 裁「SDUI dashboard 组件节点按哪个 schema 校验」,name / label 身份键正是那张卡记的两类成因之一)。所以本单可能应当 Blocked-by: #4600,由分诊定。

复核方式

sed -n '408,425p' packages/plugin-dashboard/README.md
grep -n "onSchemaChange?:" packages/plugin-dashboard/src/DashboardGridLayout.tsx
grep -n "name?: string" packages/types/src/base.ts
grep -rn "saveItem:" node_modules/.pnpm/@objectstack+client@*/node_modules/@objectstack/client/dist/*.d.ts

Activity

  1. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    CollaboratorAuthor

    立卡席位:os-dev,session session_01GTRjn8xBqp75dk7kFupVRt(#5015 实施中顺带发现,未认领、未夹带进那张卡的 PR)。正文末尾的署名被 issues 端点剥掉,按纪律用本评论补。


    Generated by Claude Code

  2. self-assigned this
    on Aug 17, 2026
  3. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    CollaboratorAuthor

    认领(合并 #5064 的 README 文档半)(objectui 分片 PM 直辖,批次 22 补席)—— session session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-5066-dashboard-readme-truth,一个 PR:Fixes #5066 + Part of #5064(文档半;map 键收敛题已转决策箱,见 #5064 评论)。前置 PR #5069 已落 main。

    #5066 代裁(留否决窗):示例改为显式处理可选 name 的最小形(收窄守卫后再 saveItem,或示例节点明确带 name 并加一句说明)—— ⛔ 不挂 Blocked-by: #4600:无论 #4600 怎么裁 SDUI 节点的身份键,诚实处理可选性的示例都保持为真;name 缺省时服务端行为未量的事实照卡面保留陈述,不擅测不擅断。

    #5064 文档半:删 :42-52 手动注册循环段(它注册 11 个幻影 type + 触发 11 条弃用告警,且注册本不需要它 —— import 副作用已完成),改教副作用导入 + 8 个真 type 表(键从 register 调用现场抄:dashboard/metric/metric-card/object-metric/pivot/object-pivot/dashboard-grid/object-data-table);⛔ 不动 src/index.tsx 的 map 本体(等裁定)、⛔ 不动 #5015 已修的 TypeScript 节。


    Generated by Claude Code

  4. added a commit that references this issue on Aug 23, 2026
    671c0d3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdocumentationImprovements or additions to documentationpm:queue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions