Monorepo跨项目丢失Zod与tRPC类型,部分类型变为any
Monorepo中tRPC跨项目类型丢失问题
基于Yarn Workspaces构建的Monorepo,结构如下:
apps/site:导入tRPCAppRouter的NextJS客户端apps/backend:暴露AppRouter的express后端apps/config:项目通用基础tsconfig文件packages/frontend-shared:共享UI组件(与本次问题无关)
问题复现
在客户端apps/site/src/lib/ApiProvider.ts中出现类型校验失效问题:
// 直接从后端导入类型,使用类型别名简化 import type { AppRouter, EmailType, ProfileType, Test } from "@company/backend/trpc"; export type { AppRouter } from "@company/backend/trpc"; import { inferProcedureOutput } from "@trpc/server"; // 类型被推断为any,悬停查看app router时context也是any type loginOutputType = inferProcedureOutput<AppRouter["user"]["login"]>; // ProfileType没有test字段,但类型检查未报错 const a: ProfileType = {}; a.test = false; // 此处类型检查正常报错 const b: EmailType = {}; b.test = false; const t: Test = {}
具体异常表现:
- tRPC方法输出类型被推断为
any ProfileType类型校验失效,添加不存在的字段无报错EmailType和Test类型校验正常
TypeScript配置
所有项目均继承基础tsconfig(开启strict等严格模式),配置内容如下:
{ "$schema": "https://json.schemastore.org/tsconfig", "display": "Default", "compilerOptions": { "composite": false, "declaration": true, "declarationMap": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "inlineSources": false, "isolatedModules": true, "moduleResolution": "node", "preserveWatchOutput": true, "skipLibCheck": true, "noUncheckedIndexedAccess": true, "strict": true, "noUnusedLocals": true, "noUnusedParameters": false }, "exclude": ["node_modules"] }
已尝试的解决方案
已尝试以下操作但问题未解决:
- 调整tsconfig各项配置参数
- 重新配置tRPC路由与类型导出
- 删除项目路径别名
- 清理Yarn缓存并重新安装依赖
- 启用TypeScript项目引用(composite模式)
目前仅有的临时方案是将API层改为独立包直接导入,但需要大量重构,不符合现有架构设计预期。
内容的提问来源于stack exchange,提问作者Nikola-Milovic
相关产品推荐
相关产品推荐

