Skip to content

[finding][drivers] 五个驱动的 find/count/… 仍声明 query: QueryAST,而调用方已可省略 object —— 双变让它编译,但声明开始说谎 #6075

Description

@qq9340100

Blocked-by: #5181

#5181IDataDriver 的 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.objectstring,而运行时它可能是 undefined。今天没有人踩到,因为实测五个驱动没有一个读 query.object

grep -rn "query\.object" packages/drivers/*/src --include=*.ts   # 零命中

sql-driver.ts:2414r.objectsys_sequence 的行列,turso/remote-transport.tss.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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions