Skip to content

metadata-admin:嵌套 union「只剩一个成员接受了值的类型」时仍塌成 Invalid input(config.sort 等) #3678

Description

@yinlianghui

发现于 #3626 的实施(PR #3677)。观察类,不是用户今天会撞到的回归 —— path 是真的,只是 message 泛化。分诊定级请自行裁决,本卡只负责记录测量。

背景

#3606 / PR #3624 展开了根级 union;#3626 / PR #3677 展开了嵌套的 config.columns(string[] | ColumnDef[],按值的首元素判别)。#3677 里那条规则被刻意收窄成「两个成员接受了值的类型」的 union,即真正的「A 的数组 或 B 的数组」。

收窄是必要的:config.sortstring | ColumnSort[],同样两成员、同样可以是数组值。只看首元素会对 sort: ['name'] 选中纯 string 成员并报「expected string, received array」—— 对一个正确写了数组的人说的最没用的话。这条误选在 PR #3677 里被钉成了测试(删掉收窄条款那一行,它就红)。

这张卡记的是收窄之后留下的空档

只剩一个成员接受了值的类型时,选它是无歧义的 —— 不需要任何内容判别,也不是启发式。但 #3677 没做:它的授权范围是「按内容判别」,「唯一候选」是另一条规则,不硬凑。

实测(@objectstack/spec 17.0.0-rc.5,两条路一致):

body 今天的 path + message 「唯一候选」规则本可给出
sort: [{field: 'n', order: 'bogus'}] config.sort / Invalid input config.sort.0.order / Invalid option: expected one of "asc"|"desc"
sort: ['name'] config.sort / Invalid input config.sort.0 / expected object, received string

成员分组实测形态:

[invalid_union] path=["config","sort"] msg="Invalid input"
  member[0] (string)          [invalid_type]  path=[]           "expected string, received array"   ← 没接受类型
  member[1] (ColumnSort[])    [invalid_value] path=[0,"order"]  "Invalid option: expected one of …"  ← 唯一候选

范围

走了一遍整个 view 家族的 Zod 树:16 个无判别式的嵌套 unioncolumns 已由 #3677 覆盖;其余大多在值类型不匹配时全体拒绝(filter[].valuegantt.tooltipFields[]sections[].fields[] ……),那种情况「唯一候选」也无话可说,仍应保留原消息。真正能被这条规则救回来的是 sort 这类标量 或 数组的两成员 union。

判断这值不值得做

倾向:等 objectstack#6391 的裁决;若 spec 侧不接,这条可作为不跨仓的兜底,和 #3626 的定位一样。

相关:#3606#3626、PR #3624、PR #3677、objectstack#6391。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions