Skip to content

packages/metadata-core/test/types.test.ts@ts-expect-error 是幽灵检查:文件在 include: ["src/**/*"] 之外,没有任何 exclude 指向它 #5476

Description

@os-zhuang

#5286 为新的 PINS_CHECKED 不变式做全仓扫描时发现,记录备查,未认领。基线 origin/main @ 01c0baef9

事实

packages/metadata-core/test/types.test.ts@ts-expect-error 指令,而该文件不在该包 tsc program 里

packages/metadata-core/tsconfig.json
  "include": ["src/**/*"]
  "exclude": ["node_modules", "dist"]
package.json  "typecheck": "tsc --noEmit"

tsc --showConfig 解析实际 program,test/ 树整体不在其中(program 里只有 src/**,例如 ./src/protocol-handshake.test.ts./src/objects/sys-view-definition.object.test.ts)。

成因和 #5286 那一例不同,这一点是本单的要点:#5286packages/spec 是被 exclude: ["**/*.test.ts"] 显式排除的;这里没有任何 exclude 指向它,它只是落在 include 根之外。后果是 check:type-check-coverageTESTS_COVERED 也看不见它——那条不变式只统计 include 根之下的测试文件,所以这个包的 testFiles 计数是 0,既不报警也不进 TEST_DEBT。两种「未检查」形态,一种检测手段抓不住另一种。

后果

#5286 的结论一样:指令从不被求值。删掉那一行 @ts-expect-errorpnpm typecheckpnpm testcheck:type-check-coverage 全部照绿。它看起来像一条被钉住的契约,实际什么也没钉住。

现状(已被记账,非未知)

#5286 的 PR 新增了全仓不变式 PINS_CHECKEDscripts/check-type-check-coverage.mjs):带 @ts-expect-error 的测试文件不得落在任何 tsc program 之外。本文件作为 seed 之一登记在 PHANTOM_PIN_DEBT 里,该台账只减不增、对新条目关闭,条目一旦不再成立(文件进 program / 指令消失 / 文件移动)RECONCILED 方向会强制删除。也就是说这条已经是「可数」的了,本单是给它一个可认领的修复入口。

建议修复

任选其一,都能让 PHANTOM_PIN_DEBT 的这条自动变红并被删除:

  1. include 扩到 ["src/**/*", "test/**/*"](最直接;需先看 test/ 下还有多少现存类型错误);或
  2. @ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 的路子加一份 sibling tsconfig.test.json 并在 typecheck 脚本里指名(@ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 已让 TESTS_COVERED 识别被脚本链指名的 sibling 配置)。

修完记得在同一个 PR 里删掉 scripts/check-type-check-coverage.mjsPHANTOM_PIN_DEBT 的对应条目——不删会红。

关联:#5286(不变式与台账来源)、#4311(typecheck 覆盖棘轮)、#5449packages/client 那一例,另一种成因:exclude 显式排除)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions