发现于 #4700 的收尾验证(顺手跑了一次 tsc --noEmit),与那条 issue 无关,按 Prime Directive #10 单独归档,未在 #4700 的 PR 里修。
现象
packages/qa/dogfood/tsconfig.json 是一份认真的配置 —— strict: true、module/moduleResolution: NodeNext、include: ["src/**/*", "test/**/*"]。但 packages/qa/dogfood/package.json 的 scripts 只有 test:
| 包 |
scripts |
packages/qa/dogfood |
test |
packages/qa/downstream-contract |
typecheck, test |
packages/qa/http-conformance |
test, typecheck |
根 pnpm typecheck 是 turbo run typecheck,只会跑声明了该 script 的包。于是 dogfood 这份 tsconfig 从来没有被执行过 —— 三个 qa 包里唯一漏掉的一个。
积下来的量
$ cd packages/qa/dogfood && npx tsc --noEmit 2>&1 | grep -c "error TS"
14
分三类:
- NodeNext 缺扩展名(2 处) ——
field-zoo-roundtrip.dogfood.test.ts:24 与 field-zoo-value-shape.test.ts:17 都写 from './field-zoo.matrix'。文件确实在(test/field-zoo.matrix.ts),但 moduleResolution: NodeNext 要求 './field-zoo.matrix.js',所以报 TS2307: Cannot find module。vitest 能跑,tsc 不认。
- fixture 里的 flow
type 没收窄(多处) —— test/fixtures/flow-durable-suspend-fixture.ts:103、flow-function-effect-fixture.ts:71 等,对象字面量推成 type: string,赋给 flow 那个字面量联合(api | schedule | autolaunched | screen | record_change)时失败。加 as const 或显式标注即可。
- 条件展开出的 headers 类型(2 处) ——
attachments-permission-matrix.dogfood.test.ts:67,81,token ? { Authorization } : {} 展开后与 HeadersInit 不兼容。
为什么值得记一笔
这就是「declared ≠ enforced」在构建配置层的形状:一份 strict 的 tsconfig 摆在那里,读代码的人(和写代码的 agent)会合理地假设它在 CI 里把关,于是照着它的严格度写;实际上没有任何一步跑它。dogfood 是这个仓最重的行为门,它的 fixture 类型漂移没有任何东西会挡。而且它是可修的:14 个错误都是机械性的,没有一个需要架构决定。
建议
- 先把这 14 个修掉(三类都是小改)。
- 给
packages/qa/dogfood/package.json 加 "typecheck": "tsc --noEmit",让它进 turbo run typecheck 的图 —— 与两个 sibling qa 包一致。
- 顺序不能反:先加 script 会直接把 typecheck 作业弄红。
如果结论是「dogfood 故意不做类型检查」,那么该删的是这份 tsconfig(或把它降到非 strict),而不是让一份没人执行的严格配置继续留在那里误导人。
Refs: #4700(发现处)、Prime Directive #10
发现于 #4700 的收尾验证(顺手跑了一次
tsc --noEmit),与那条 issue 无关,按 Prime Directive #10 单独归档,未在 #4700 的 PR 里修。现象
packages/qa/dogfood/tsconfig.json是一份认真的配置 ——strict: true、module/moduleResolution: NodeNext、include: ["src/**/*", "test/**/*"]。但packages/qa/dogfood/package.json的 scripts 只有test:packages/qa/dogfoodtestpackages/qa/downstream-contracttypecheck,testpackages/qa/http-conformancetest,typecheck根
pnpm typecheck是turbo run typecheck,只会跑声明了该 script 的包。于是 dogfood 这份 tsconfig 从来没有被执行过 —— 三个 qa 包里唯一漏掉的一个。积下来的量
分三类:
field-zoo-roundtrip.dogfood.test.ts:24与field-zoo-value-shape.test.ts:17都写from './field-zoo.matrix'。文件确实在(test/field-zoo.matrix.ts),但moduleResolution: NodeNext要求'./field-zoo.matrix.js',所以报TS2307: Cannot find module。vitest 能跑,tsc 不认。type没收窄(多处) ——test/fixtures/flow-durable-suspend-fixture.ts:103、flow-function-effect-fixture.ts:71等,对象字面量推成type: string,赋给 flow 那个字面量联合(api | schedule | autolaunched | screen | record_change)时失败。加as const或显式标注即可。attachments-permission-matrix.dogfood.test.ts:67,81,token ? { Authorization } : {}展开后与HeadersInit不兼容。为什么值得记一笔
这就是「declared ≠ enforced」在构建配置层的形状:一份
strict的 tsconfig 摆在那里,读代码的人(和写代码的 agent)会合理地假设它在 CI 里把关,于是照着它的严格度写;实际上没有任何一步跑它。dogfood 是这个仓最重的行为门,它的 fixture 类型漂移没有任何东西会挡。而且它是可修的:14 个错误都是机械性的,没有一个需要架构决定。建议
packages/qa/dogfood/package.json加"typecheck": "tsc --noEmit",让它进turbo run typecheck的图 —— 与两个 sibling qa 包一致。如果结论是「dogfood 故意不做类型检查」,那么该删的是这份 tsconfig(或把它降到非 strict),而不是让一份没人执行的严格配置继续留在那里误导人。
Refs: #4700(发现处)、Prime Directive #10