Skip to content

[finding][drivers] checkDateBucketParity 的每个调用点都写 driver as never,把 BucketableDriver 替身的编译期一致性整个抹掉 —— 且实测该 cast 并不必要 #6354

Description

@os-zhuang

#6212 批 A+E(PR 见下)实施期间实测发现,记录备查。观察类,不挂 pm:queue,请分诊轮定级。

现状

@objectstack/verify 导出 checkDateBucketParity(driver: BucketableDriver, opts?)BucketableDriver 是它对被测驱动的结构替身packages/verify/src/date-bucket-parity.ts)。全仓每一个调用点都把驱动 cast 成 never 再传进去:

调用点 写法
packages/qa/dogfood/test/date-bucket-parity-conformance.test.ts:49 checkDateBucketParity(make() as never, { … })
packages/drivers/driver-turso/src/date-bucket-parity.test.ts:43 checkDateBucketParity(driver as never, { … })
packages/drivers/driver-turso/src/date-bucket-parity.test.ts:128 checkDateBucketParity(driver as never, { … })

as never 之后,「这个驱动确实具备替身声明的那组方法」这件事一次也没有被检查过。替身存在的意义正是表达这组一致性,而 100% 的调用点把它关掉了——这与 #6212 正文记的是同一族事实(一个声明了却没人读的形状),只是发生在调用点而不是声明点,与 #6210 在 dogfood 踩的 DriverLike 同盲区。

实测:这个 cast 并不必要

date-bucket-parity-conformance.test.ts:49as never 去掉后:

> @objectstack/dogfood@0.0.40-rc.4 typecheck
> tsc --noEmit
(无输出,退出码 0)

SqlDriverSqliteWasmDriver 结构上本来就满足 BucketableDriver注意这是在 #6212 批 A+E 已经把 BucketableDriver.aggregatequery: unknown 收窄为 DriverQuery 之后测的——收窄前只会更宽松,所以这是一处先于本次改动就已存在的死 cast。turso 的两处未单独实测(未改动该包),但它继承自 SqlDriver,预期同理,实施时需各自复核。

不是缺陷,别当缺陷派

运行期行为完全正确:checkDateBucketParity 照常跑,date-bucket 一致性照常被验证(dogfood 520 tests 全绿)。丢掉的只是编译期的一致性检查——今天没有人踩。所以判级请按观察类走。

代价是休眠的:哪天某个驱动少掉替身要求的一个方法,或者替身自身长出新成员,三个调用点一个都不会红,checkDateBucketParity 会在运行期抛 driver.aggregate is not a function 之类,而不是在 tsc 里被拦下。

如果要做

逐处去掉 as never 并各自复核 typecheck(dogfood 已实测可去;turso 两处待测)。若某处去掉后真的报错,那个报错本身才是有价值的产出——它会指出替身与真实驱动之间一处此前无人知晓的形状分歧,届时应先判断该改替身还是该改驱动,而不是把 cast 加回去。

⚠️ 同族但不在本单内、需要分别判断的:checkReadCoercionCoercibleDriver 是否也有同样的调用点 cast(未实测)。

会话:session_01WyvqvKMG6asi9aXjKE6xtx#6212 批 A+E 实施期间发现,未认领)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions