在 #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:49 把 as never 去掉后:
> @objectstack/dogfood@0.0.40-rc.4 typecheck
> tsc --noEmit
(无输出,退出码 0)
SqlDriver 与 SqliteWasmDriver 结构上本来就满足 BucketableDriver。注意这是在 #6212 批 A+E 已经把 BucketableDriver.aggregate 从 query: 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 加回去。
⚠️ 同族但不在本单内、需要分别判断的:checkReadCoercion 的 CoercibleDriver 是否也有同样的调用点 cast(未实测)。
会话:session_01WyvqvKMG6asi9aXjKE6xtx(#6212 批 A+E 实施期间发现,未认领)
在 #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:49checkDateBucketParity(make() as never, { … })packages/drivers/driver-turso/src/date-bucket-parity.test.ts:43checkDateBucketParity(driver as never, { … })packages/drivers/driver-turso/src/date-bucket-parity.test.ts:128checkDateBucketParity(driver as never, { … })as never之后,「这个驱动确实具备替身声明的那组方法」这件事一次也没有被检查过。替身存在的意义正是表达这组一致性,而 100% 的调用点把它关掉了——这与 #6212 正文记的是同一族事实(一个声明了却没人读的形状),只是发生在调用点而不是声明点,与 #6210 在 dogfood 踩的DriverLike同盲区。实测:这个 cast 并不必要
在
date-bucket-parity-conformance.test.ts:49把as never去掉后:SqlDriver与SqliteWasmDriver结构上本来就满足BucketableDriver。注意这是在 #6212 批 A+E 已经把BucketableDriver.aggregate从query: 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 加回去。checkReadCoercion的CoercibleDriver是否也有同样的调用点 cast(未实测)。会话:
session_01WyvqvKMG6asi9aXjKE6xtx(#6212 批 A+E 实施期间发现,未认领)