发现于 #3626 的实施(PR #3677)。观察类,不是用户今天会撞到的回归 —— path 是真的,只是 message 泛化。分诊定级请自行裁决,本卡只负责记录测量。
背景
#3606 / PR #3624 展开了根级 union;#3626 / PR #3677 展开了嵌套的 config.columns(string[] | ColumnDef[],按值的首元素判别)。#3677 里那条规则被刻意收窄成「两个成员都接受了值的类型」的 union,即真正的「A 的数组 或 B 的数组」。
收窄是必要的:config.sort 是 string | 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 个无判别式的嵌套 union。columns 已由 #3677 覆盖;其余大多在值类型不匹配时全体拒绝(filter[].value、gantt.tooltipFields[]、sections[].fields[] ……),那种情况「唯一候选」也无话可说,仍应保留原消息。真正能被这条规则救回来的是 sort 这类标量 或 数组的两成员 union。
判断这值不值得做
倾向:等 objectstack#6391 的裁决;若 spec 侧不接,这条可作为不跨仓的兜底,和 #3626 的定位一样。
相关:#3606、#3626、PR #3624、PR #3677、objectstack#6391。
发现于 #3626 的实施(PR #3677)。观察类,不是用户今天会撞到的回归 —— path 是真的,只是 message 泛化。分诊定级请自行裁决,本卡只负责记录测量。
背景
#3606 / PR #3624 展开了根级 union;#3626 / PR #3677 展开了嵌套的
config.columns(string[] | ColumnDef[],按值的首元素判别)。#3677 里那条规则被刻意收窄成「两个成员都接受了值的类型」的 union,即真正的「A 的数组 或 B 的数组」。收窄是必要的:
config.sort是string | ColumnSort[],同样两成员、同样可以是数组值。只看首元素会对sort: ['name']选中纯string成员并报「expected string, received array」—— 对一个正确写了数组的人说的最没用的话。这条误选在 PR #3677 里被钉成了测试(删掉收窄条款那一行,它就红)。这张卡记的是收窄之后留下的空档
当只剩一个成员接受了值的类型时,选它是无歧义的 —— 不需要任何内容判别,也不是启发式。但 #3677 没做:它的授权范围是「按内容判别」,「唯一候选」是另一条规则,不硬凑。
实测(
@objectstack/spec17.0.0-rc.5,两条路一致):sort: [{field: 'n', order: 'bogus'}]config.sort/Invalid inputconfig.sort.0.order/Invalid option: expected one of "asc"|"desc"sort: ['name']config.sort/Invalid inputconfig.sort.0/expected object, received string成员分组实测形态:
范围
走了一遍整个
view家族的 Zod 树:16 个无判别式的嵌套 union。columns已由 #3677 覆盖;其余大多在值类型不匹配时全体拒绝(filter[].value、gantt.tooltipFields[]、sections[].fields[]……),那种情况「唯一候选」也无话可说,仍应保留原消息。真正能被这条规则救回来的是sort这类标量 或 数组的两成员 union。判断这值不值得做
viewedit-gate union failures into per-field diagnostics #3624/fix(app-shell): expand the nestedconfig.columnsunion into per-column diagnostics #3677 已建立的「只动呈现、不动判定、只展示选中成员」约束完全兼容,增量很小。倾向:等 objectstack#6391 的裁决;若 spec 侧不接,这条可作为不跨仓的兜底,和 #3626 的定位一样。
相关:#3606、#3626、PR #3624、PR #3677、objectstack#6391。