我前端项目主要依赖 vite + typescript + zod。为了 schema 一致性,我在前端直接引用了 Deno 项目下的 schema 定义(Deno 侧也使用相同版本的 zod)。
最初一切正常,但一次目录结构调整后,编辑器里跨目录引入的类型几乎都失效,表现为大量 any / 类型提示消失。
#原因排查
通过 tsc –traceResolution 找到具体原因
pnpm -C desktop exec tsc --noEmit -p tsconfig.app.json --traceResolution 关键日志大概如下:
Resolving module '~runner-schemas/tasks' ...
Module name '~runner-schemas/tasks' was successfully resolved to '.../runner/src/schemas/tasks/index.ts'
Resolving module 'zod' from '.../runner/src/schemas/tasks/task-event.ts' ...
Module name 'zod' was not resolved 这个证据说明:
-
~runner-schemas/tasks别名本身解析成功了。 - 继续解析该文件依赖时,
zod失败,后续类型链被抑制,所以业务侧看到的是any。
#为什么目录调整后会触发
最初目录:
.
├── node_modules
├── src
├── src-deno
├── tsconfig.json 调整后目录:
.
├── desktop
│ ├── node_modules
│ ├── src
│ └── tsconfig.app.json
└── src-deno 这里 src-deno 相对于 desktop 是 parent-sibling(不是 sibling)。
TypeScript 在解析 src-deno 文件里的 import 'zod' 时,不会自然命中 desktop/node_modules,于是 zod 类型解析失败。
#修复方式
在前端 tsconfig 的 paths 里同时配置:
- schema 路径别名
-
zod到前端node_modules的显式映射
{
"compilerOptions": {
"paths": {
"~runner-schemas/*": ["../src-deno/schemas/*"],
"zod": ["./node_modules/zod"],
"zod/*": ["./node_modules/zod/*"]
}
}
}