Blocked-by: #5181
#5181 把 IDataDriver 的 query 参数收窄为 DriverQuery(即 Omit< QueryAST, 'object' >)之后留下的机械收尾。#5181 的派单明确 ⛔ 不改 driver 代码,故单独记录。
现状(实测)
契约侧六个方法(find / findOne / count / updateMany / deleteMany / explain)的 query 参数已经是 DriverQuery;五个驱动的实现仍旧写 query: QueryAST:
packages/drivers/driver-memory/src/memory-driver.ts:283,342,444,469,502
packages/drivers/driver-mongodb/src/mongodb-driver.ts:236,248,366,437,455,544
packages/drivers/driver-sql/src/sql-driver.ts:2091,2251,2825,2837,2876
packages/drivers/driver-sqlite-wasm(继承 sql 侧)
packages/drivers/driver-turso/src/turso-driver.ts:499,504,535,863,870(这些是 query: any,另一种形态的同一问题)
这不是红的,也不会红:方法参数按双变比较,所以实现声明得比契约宽照样满足契约。全仓 pnpm typecheck 125/125 绿,就是在这个前提下拿到的。
为什么仍是一笔账
调用方现在有权省略 object(这正是 #5181 的目的)。于是一个声明 query: QueryAST 的实现,其类型说 query.object 是 string,而运行时它可能是 undefined。今天没有人踩到,因为实测五个驱动没有一个读 query.object:
grep -rn "query\.object" packages/drivers/*/src --include=*.ts # 零命中
(sql-driver.ts:2414 的 r.object 是 sys_sequence 的行列,turso/remote-transport.ts 的 s.object 是 schema 批同步的入参,都不是 query AST。)
所以这是休眠的类型谎言,不是活体缺陷:下一个在驱动里写 query.object 的人会拿到一个编译期看着是 string、运行期是 undefined 的值,而没有任何门会拦他。
建议范围
把五个驱动的这些签名从 QueryAST / any 换成 DriverQuery(从 @objectstack/spec/contracts 导入),一轮翻完。翻完之后「驱动读 query.object」直接变成编译错误,谎言就没了藏身处。纯机械,无运行时变化,turso 那几处 any 顺手一并收紧还能多拿回一批检查。
按观察类记录、不挂 pm:queue,请分诊轮定级。
会话:session_011M7UwH25Unfi73UHim7ajY(#5181 实施期间发现,未认领)
Generated by Claude Code
Blocked-by: #5181
#5181 把
IDataDriver的 query 参数收窄为DriverQuery(即Omit< QueryAST, 'object' >)之后留下的机械收尾。#5181 的派单明确 ⛔ 不改 driver 代码,故单独记录。现状(实测)
契约侧六个方法(
find/findOne/count/updateMany/deleteMany/explain)的 query 参数已经是DriverQuery;五个驱动的实现仍旧写query: QueryAST:packages/drivers/driver-memory/src/memory-driver.ts:283,342,444,469,502packages/drivers/driver-mongodb/src/mongodb-driver.ts:236,248,366,437,455,544packages/drivers/driver-sql/src/sql-driver.ts:2091,2251,2825,2837,2876packages/drivers/driver-sqlite-wasm(继承 sql 侧)packages/drivers/driver-turso/src/turso-driver.ts:499,504,535,863,870(这些是query: any,另一种形态的同一问题)这不是红的,也不会红:方法参数按双变比较,所以实现声明得比契约宽照样满足契约。全仓
pnpm typecheck125/125 绿,就是在这个前提下拿到的。为什么仍是一笔账
调用方现在有权省略
object(这正是 #5181 的目的)。于是一个声明query: QueryAST的实现,其类型说query.object是string,而运行时它可能是undefined。今天没有人踩到,因为实测五个驱动没有一个读query.object:(
sql-driver.ts:2414的r.object是sys_sequence的行列,turso/remote-transport.ts的s.object是 schema 批同步的入参,都不是 query AST。)所以这是休眠的类型谎言,不是活体缺陷:下一个在驱动里写
query.object的人会拿到一个编译期看着是string、运行期是undefined的值,而没有任何门会拦他。建议范围
把五个驱动的这些签名从
QueryAST/any换成DriverQuery(从@objectstack/spec/contracts导入),一轮翻完。翻完之后「驱动读query.object」直接变成编译错误,谎言就没了藏身处。纯机械,无运行时变化,turso那几处any顺手一并收紧还能多拿回一批检查。按观察类记录、不挂
pm:queue,请分诊轮定级。会话:
session_011M7UwH25Unfi73UHim7ajY(#5181 实施期间发现,未认领)Generated by Claude Code