从 #6320 (PR #6517 )的实施中带出。观察类,不是今天会炸的缺陷 :无用户可触达面,pnpm test 全绿,任何门禁都不报。按 PD #10 另立单记录,不在 #6320 的 PR 里顺手扫。
事实(实测于 origin/main)
SqlDriver.knex 声明为 protected(packages/drivers/driver-sql/src/sql-driver.ts:1876),所以类外的测试 fixture 确实需要一次强制转换才能拿到 knex 实例做建表/插数据。当前全仓统一用的写法是:
let knexInstance : any ;
knexInstance = ( driver as any ) . knex ;
git grep -c "as any).knex" origin/main -- packages/drivers/ 逐包汇总(计的是命中行数 ,非命中次数):
包
文件数
命中行数
driver-sql
37
74
driver-sqlite-wasm
14
32
driver-turso
1
1
合计
52
107
其中 packages/drivers/driver-sqlite-wasm/src/sqlite-wasm-driver.ts 是非测试 代码里的一处,其余在测试里。
为什么记下来
as any 在这里是过量的 。要读的成员只有一个(knex),但 as any 把整个 driver 的类型一起抹掉 —— 同一个 knexInstance 变量随后也被声明成 any,于是它上面的 schema.createTable / .insert / .destroy 全部不受检查,createTable 的回调参数也只能写成 (t: any)。一次转换的代价被放大到整条 fixture 链。
它落在所有既有门禁的盲区里 ,这一点是实测的、不是推断的:
现成的替代写法就在仓里 (fix(drivers): 聚合函数拒收带上 ADR-0112 信封,并把两类条件分开措辞 (#5907) #6204 体例):点名要读的那一个成员,而不是抹掉整个对象。
import type { Knex } from 'knex' ;
let knexInstance : Knex ;
knexInstance = ( driver as unknown as { knex : Knex } ) . knex ;
PR refactor(driver-sql)!: distinct 的第三参收成裸 FilterCondition (#6320) #6517 已在它自己新增的两个测试文件 上用了这个写法并验证通过(两包 typecheck 绿、967 + 257 测试通过、eslint 绿),knex 在两个包里都是直接依赖,所以 import type { Knex } 处处可用。⛔ 它没有顺手扫兄弟文件 —— 超出 drivers: distinct 的第三参在 memory 与 sql 上语义不同 —— 把 sql 那面的写法交给 memory,静默返回未过滤全集(运行期实测) #6320 的范围。
不代裁的处置线索
这是测试脚手架的类型卫生 ,不是契约缺陷,严重度应由分诊定,不由本单预设;
若要扫,扫的是一个机械替换(52 文件),但值不值得扫是个判断题 :它买到的是 fixture 链上的类型检查,付出的是一次大面积改动与其后的合并冲突面;
另一个方向是根本不扫 ,而是给 SqlDriver 一个测试用的具名读取口,让 fixture 不再需要任何转换 —— 但那是往驱动上加面,需要真实业务/测试拉力才划算,⛔ 本单不预判;
第三条:sqlite-wasm-driver.ts 里那一处非测试 出现值得单独看一眼,与测试里的那批不是同一回事。
关联:#6320 / PR #6517 (出处)、#4918 (有意排除测试代码的那条护栏,已 closed)、#6204 (as unknown as 具名类型 的体例)。
从 #6320(PR #6517)的实施中带出。观察类,不是今天会炸的缺陷:无用户可触达面,
pnpm test全绿,任何门禁都不报。按 PD #10 另立单记录,不在 #6320 的 PR 里顺手扫。事实(实测于
origin/main)SqlDriver.knex声明为protected(packages/drivers/driver-sql/src/sql-driver.ts:1876),所以类外的测试 fixture 确实需要一次强制转换才能拿到 knex 实例做建表/插数据。当前全仓统一用的写法是:git grep -c "as any).knex" origin/main -- packages/drivers/逐包汇总(计的是命中行数,非命中次数):其中
packages/drivers/driver-sqlite-wasm/src/sqlite-wasm-driver.ts是非测试代码里的一处,其余在测试里。为什么记下来
as any在这里是过量的。要读的成员只有一个(knex),但as any把整个 driver 的类型一起抹掉 —— 同一个knexInstance变量随后也被声明成any,于是它上面的schema.createTable/.insert/.destroy全部不受检查,createTable的回调参数也只能写成(t: any)。一次转换的代价被放大到整条 fixture 链。它落在所有既有门禁的盲区里,这一点是实测的、不是推断的:
check:query-options-erasure的词表只匹配 query/options 位置的as any,(driver as any).knex从来没进过它的计数(PR refactor(driver-sql)!: distinct 的第三参收成裸 FilterCondition (#6320) #6517 改动前后,它报的都是263 test-surface sites in 49 files,一模一样);as any/: any擦除(#4721 的顺带项,已实测残余量) #4918(已 closed)把这条 lint 护栏有意收窄到「引擎/驱动查询选项」一个语义位,并有意排除测试代码,所以本单不是它的重复件,也不与它的裁决冲突 —— 是它明确划出去的那一片。pnpm lint对测试文件不报这一形状。现成的替代写法就在仓里(fix(drivers): 聚合函数拒收带上 ADR-0112 信封,并把两类条件分开措辞 (#5907) #6204 体例):点名要读的那一个成员,而不是抹掉整个对象。
PR refactor(driver-sql)!: distinct 的第三参收成裸 FilterCondition (#6320) #6517 已在它自己新增的两个测试文件上用了这个写法并验证通过(两包 typecheck 绿、967 + 257 测试通过、eslint 绿),
knex在两个包里都是直接依赖,所以import type { Knex }处处可用。⛔ 它没有顺手扫兄弟文件 —— 超出 drivers:distinct的第三参在 memory 与 sql 上语义不同 —— 把 sql 那面的写法交给 memory,静默返回未过滤全集(运行期实测) #6320 的范围。不代裁的处置线索
SqlDriver一个测试用的具名读取口,让 fixture 不再需要任何转换 —— 但那是往驱动上加面,需要真实业务/测试拉力才划算,⛔ 本单不预判;sqlite-wasm-driver.ts里那一处非测试出现值得单独看一眼,与测试里的那批不是同一回事。关联:#6320 / PR #6517(出处)、#4918(有意排除测试代码的那条护栏,已 closed)、#6204(
as unknown as 具名类型的体例)。