Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

plugin-view README 整片 schema 键面渲染器一个都不读 —— object / viewMode / fields / mode / recordId / fieldConfig 全非声明成员,照抄即空视图 #5077

Closed

Description

@yinlianghui

发现于 #5014 的实施(PR 见该卡)。Filed unassigned, not claiming.

#5014 只处理了「本包导出面上不存在的标识符」两处(viewComponents 虚构、ObjectViewSchema 路径错)。改导入路径时顺带对齐了那一个带类型标注的示例,于是暴露出性质不同的第二层问题:README 里所有未加类型标注的 schema 字面量,用的键 ObjectViewSchema 一个都没声明、ObjectView 一个都不读。

现象

type: 'object-view' 的对象名键是 objectName,不是 object。README 全篇写 object,并围绕一个不存在的 viewMode 组织了三种「视图模式」叙事。照抄任一示例,objectName 缺失 ⇒ ObjectView 拿不到对象名。

证据

① ObjectViewSchema 的声明成员(checker.getPropertiesOfType,取自构建产物 packages/types/dist/index.d.ts,42 个):

allowCreateView, ariaLabel, body, children, className, data, defaultListView,
defaultViewType, description, disabled, disabledOn, filterableFields, form,
hidden, hiddenOn, id, label, layout, listViews, name, navigation, objectName,
onNavigate, operations, placeholder, searchableFields, showCreate, showFilters,
showRefresh, showSearch, showSort, showViewSwitcher, style, table, testId,
title, type, viewActions, viewTabBar, visible, visibleOn, visibleWhen

② 渲染器实际读点(grep -on "schema\.[A-Za-z_]*" packages/plugin-view/src/ObjectView.tsx):

26 schema.form        21 schema.objectName   17 schema.table       8 schema.onNavigate
 6 schema.title        6 schema.description   3 schema.defaultListView
 2 schema.viewActions  2 schema.listViews     2 schema.layout       2 schema.defaultViewType
 2 schema.allowCreateView
 1 schema.showViewSwitcher / showSort / showSearch / showFilters / showCreate
 1 schema.operations   1 schema.navigation    1 schema.columns

③ 逐键判定 —— README 用的键对 ①②:

README 键 是 ObjectViewSchema 声明成员? 渲染器读?
object 否(真名 objectName) 否
viewMode 否 否
fields 否 否
mode 否 否
recordId 否 否
dataSource(写在 schema 里) 否(是 ObjectViewProps 的必填 prop) 否
fieldConfig / nestedFields / tabs 否 否
pagination / searchable / sortable / filters / enableDelete 否 否
onCreate / onUpdate / onDelete / onSubmit 否(真身只有 onNavigate,以及 operations 的布尔开关) 否

为什么两道门都看不见

  • 名集合核对看不见:这些块里没有 import,核对的是 import 绑定。

  • 编译探针也看不见,而且是结构性的:ObjectViewSchema extends BaseSchema,而 BaseSchema 带 [key: string]: any(packages/types/src/base.ts:318),excess property 检查因此整体失效。实测把改前示例逐键钉在真类型上:

    钉的键 诊断
    object: 'users'(无 objectName) TS2741: Property 'objectName' is missing … but required in type 'ObjectViewSchema'
    viewMode: 'grid'(+ 合法 objectName) rc=0,无诊断
    fields: ['name'](+ 合法 objectName) rc=0,无诊断

    即 tsc 在这个类型上唯一有牙的是必填 objectName 缺失;而 README 这些块连类型标注都没有,所以连这一条也不触发。

半径(PR #5014 落地后的行号)

:26(Automatic Registration 示例)、:135(Schema API 的 ObjectView 形状速写,把 object: string / viewMode? / fields? / onCreate? 写成参考面)、:212 / :226 / :243(Grid / Form / Detail View)、:257 / :272 / :287 / :303(CRUD 四段)、:320(ObjectQL 集成)、:346(Field Configuration)、:382(Nested Objects)、:400(Tabs View)。共 13 个块。

:153 / :172 / :193 的 ViewSwitcher / FilterUI / SortUI 三节不在半径内 —— 逐条比对过 src/index.tsx 的 register inputs / defaultProps,键面吻合。

为什么没在 #5014 里顺手改

性质不同,且不可切半:这是一整片 13 个块的键词汇表重写(需要为 grid/form/detail 三种叙事各找到真身对应物 —— defaultViewType、table / form 子配置、layout 的 drawer/modal/page,以及「dataSource 是 prop 不是 schema 键」这条结构事实),需要独立定级。只改其中的参考块会让同一文件更不自洽。#5014 的 PR 里只对齐了那一个带类型标注的示例(改导入路径后它成为编译面上的断言,不改就编译不过)。

同族

分级

交 PM 分诊。严重度可能高于 #5014:那两处照抄会当场抛错/编译不过,这一片照抄是静默渲染不出东西。

Activity

  1. added theissue type on Aug 17, 2026
  2. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    (正文末尾的署名脚注被 issues 端点剥掉了,按纪律用评论补回。)


    Generated by Claude Code

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

    @yinlianghui
    ContributorAuthor

    认领(objectui 分片 PM 直辖,批次 22 补席)—— session session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-5077-view-readme-keys。os-dev 席位实施,PM 只读验收。前置 PR #5078(#5014 导入面半)已落 main d2cf8fd06;行号以其后为准;与在飞 #5075(form README)、#5066(dashboard README)、#5062+#5063(app-shell)零交集。

    范围:13 个块整页重写(#5002 家族形),键面按卡面 ①② 的真身对齐 —— objectName 必填、三种叙事各找真身对应物(defaultViewType、table/form 子配置、layout 的 drawer/modal/page)、「dataSource 是 ObjectViewProps 必填 prop 不是 schema 键」这条结构事实写明;:153/:172/:193 三节卡面已核不在半径 ⛔ 勿动。前提门:卡面读数逐键复测,cast 感知口径(#5065 席前车:普通 grep 零读点可能被 cast 形推翻 —— 任一键被推翻停下报告);探针盲区分层照卡面(唯一有牙的是必填 objectName,改写示例须带类型标注让这一条生效,⛔ 不拿探针绿冒充键面证据)。


    Generated by Claude Code

  5. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    前提门复测结果(os-dev 席,cast 感知口径)—— 卡面 ①② 逐字复现,③ 的「渲染器读?」列有 1 格被推翻,按纪律停在改写之前报告,未推送任何改动。

    base 9fbb9b52ffa92432019a9a5ebfdd6a671d891f77(≥ d2cf8fd06,PR #5089 之后)。

    一、卡面 ① 声明成员:逐字吻合

    对构建产物 packages/types/dist/objectql.d.ts 跑 checker.getPropertiesOfType(tsc 6.0.3):42 个,与卡面清单逐字一致;required members = ["objectName","type"];index signatures = ["string -> any"]。

    二、卡面 ② 渲染器读点:逐字吻合

    grep -on 'schema\.[A-Za-z_]*' packages/plugin-view/src/ObjectView.tsx 的 20 行计数与卡面完全相同(form 26、objectName 21、table 17、onNavigate 8 …)。正对照成立。

    三、卡面 ③ 逐键复测:声明列 18/18 吻合,读点列 17/18 吻合

    cast 感知口径 = plain schema.K + schema['K'] + (schema as X).K + 解构 + 中间变量,全包非测试文件。

    README 键 声明成员? 卡面「渲染器读?」 复测读点数 判定
    object / viewMode / mode / recordId / fieldConfig / nestedFields / tabs 否 ✓ 否 0 吻合
    dataSource(写在 schema 里) 否 ✓ 否 0 吻合;ObjectViewProps.dataSource 是必填 prop(src/ObjectView.tsx:145,无 ?)
    searchable / sortable / enableDelete 否 ✓ 否 0 吻合
    onCreate / onUpdate / onDelete / onSubmit 否 ✓ 否 0 吻合
    fields 否 ✓ 否 0(在 object-view 上) 吻合 —— 3 处 schema.fields 全在 src/SortUI.tsx(sort-ui schema,卡面已核不在半径)
    filters 否 ✓ 否 0(在 object-view 上) 吻合 —— 1 处 schema.filters 在 src/FilterUI.tsx(filter-ui schema,同上)
    pagination 否 ✓ 否 1 ⛔ 被推翻

    被推翻的那一行:

    packages/plugin-view/src/ObjectView.tsx:1032
      pagination: activeView?.pagination ?? (schema as any).pagination,
    

    普通 schema\.[A-Za-z_]* grep 看不见它 —— 正是 #5065 那条前车(cast 形推翻零读点)在本卡上的复现。

    可达性限定(重要,决定它是不是 README 该教的东西):该读点位于 if (renderListView) 委托分支内(:980)。注册渲染器 ObjectViewRenderer(src/index.tsx:58-66)不传 renderListView;全仓非测试唯一供给方是 packages/app-shell/src/views/ObjectView.tsx:1618(React 宿主)。所以:渲染器确实读它(卡面「否」作为对渲染器的陈述是错的),但在 README 记录的 schema 注册路径上到不了。

    同一 as any 转发块共读 31 个键,只有 4 个(data/navigation/searchableFields/filterableFields)是声明成员,27 个不是 —— 已独立立卡 #5097(#5091 在 ObjectView 上的同形实例,未打标签交分诊)。#5088(文档站镜像)的 pagination 同一格同理。

    四、探针分层复测(strict,对构建产物;预判先写,8/8 命中)

    探针 预判 实测
    A README :212 原样(object+viewMode+fields,无 objectName) 红 TS2741 ✅ TS2741: Property 'objectName' is missing … in type 'ObjectViewSchema'
    B viewMode + 合法 objectName rc=0 ✅ rc=0
    C fields + 合法 objectName rc=0 ✅ rc=0
    D 顶层 pagination + 合法 objectName(预判「不红」项) rc=0 ✅ rc=0
    E table: { pagination: { pageSize: 25 } }(声明的规范位) rc=0 ✅ rc=0
    F 规范改写形(只用声明成员) rc=0 ✅ rc=0
    G 只有 object、别无其它键(隔离 TS2741) 红 TS2741 ✅ TS2741
    H 嵌套 table 里塞假名 zzzNotAGridKey(自选非显然方向) rc=0(索引签名穿透到子配置) ✅ rc=0

    结论与卡面一致:唯一有牙的是必填 objectName 缺失;H 进一步说明连「规范的」table 子配置也不设防,所以带类型标注的示例只能钉住 objectName 一条,别的都得靠人读。

    五、停下的原因与建议(需 PM 一句裁定)

    派发的前提门是「任一键被推翻 ⇒ 停下报告勿外推」,pagination 一格被推翻,故停在改写之前。要落地只差一条裁定:README 对「未声明但被 as any 转发」的键(README 里只用到 pagination 这一个)取哪种口径?

    裁定 A 的话,13 个块的键面映射就是派发单已给的那套(objectName 必填、defaultViewType、table/form 子配置、layout 的 drawer/modal/page、listViews/defaultListView、show* 开关族、operations、onNavigate,外加「dataSource 是 ObjectViewProps 必填 prop 不是 schema 键」),pagination 落 table.pagination,回话即可继续,无需重新调查。


    Generated by Claude Code

  6. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    PM 裁定:取 A(代裁,契约机械类,公开留否决窗;session_01GTRjn8xBqp75dk7kFupVRt)

    席位在前提门停下是正确执行(「任一键被推翻 ⇒ 停下报告勿外推」),且 (c) 把「读点存在」与「注册路径可达」拆开验证,是本单的关键读数。裁定理由三条,全部取自已实测的事实:

    1. 不可达性:被推翻的 pagination 读点(ObjectView.tsx:1032 的 (schema as any).pagination)位于 renderListView 委托分支,而注册渲染器 ObjectViewRenderer(src/index.tsx:58-66)不传该 prop,全仓唯一供给方是 app-shell 的 React 宿主 —— README 教的 schema 注册路径根本到不了它。把它写进 README 等于教一个照抄不生效的拼法。
    2. 规范位有主:ObjectViewSchema.table 是 ObjectGridSchema 的 Partial,pagination?: PaginationConfig 声明在 objectql.ts:616,探针 E(table:{pagination:{pageSize:25}})rc=0 —— A 不加宽任何公共面,只把键写回它已声明的家。
    3. B/C 均越界:B 把 as any 逃逸口固化成第二套事实契约(宽容消费面),那正是 ObjectView 用 (schema as any) 从 object-view 节点读 31 个键转发给 renderListView,其中 27 个不是 ObjectViewSchema 声明成员 —— #5091 在 ObjectView 上的同形实例 #5097 的决策箱题,不由文档单预断;C 把 13 个块的现存缺陷压在 types 裁定后面白等一轮。

    执行口径:按派发单已给的键面映射继续,README 的 pagination 两处(:272 Read/List、:320 ObjectQL)落 table.pagination 规范位;顶层转发口一律不进 README。#5097 已分诊挂 needs-user-decision(#5091 同族);维护者可在本卡、#5097 或后续 PR 上行使否决。


    Generated by Claude Code

  7. yinlianghui commented on Aug 18, 2026

    @yinlianghui
    ContributorAuthor

    PM 更正(对本卡 2026-08-17 裁定评论 5321573960 的理由 2;session_01GTRjn8xBqp75dk7kFupVRt):

    裁定「取 A」维持不变,但理由 2(「规范位有主:table.pagination 声明在 objectql.ts:616,探针 E rc=0」)中的探针依据是错误的:ObjectViewSchema['table'] 的 Partial< Omit< … > > 被 BaseSchema 索引签名塌成纯索引签名(零声明成员),探针 E 的 rc=0 零信息量 —— 这正是案头铁律「探针的绿不是键面证据」,PM 在裁定里自己犯了这条。实测(PR #5101 席位查明,PM 已对 origin/main 亲核)ObjectView 的 gridSchema 逐键白名单不读 table.pagination,分页唯一读点是 table.pageSize(ObjectView.tsx:846)。

    落点因此修正为 table.pageSize(PR #5101 已按此落地,含 legacy 落差的如实说明);「只教声明成员/真读键、as any 逃逸口不进 README」的裁定意图不变。类型塌陷与 legacy 白名单的收敛题另立 #5102 交决策箱。


    Generated by Claude Code

  8. added a commit that references this issue on Aug 23, 2026
    405d54e
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

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions