如何配置TypeScript以从另一Prisma项目文件夹导入类型?
跨独立Node.js项目的TypeScript类型检查解决方案(TS+Prisma+TRPC场景)
问题核心
你遇到的本质问题是:TypeScript跨项目导入源码类型时,会将依赖项目(service_2)的代码视为当前项目(service_1)的一部分,导致解析service_2中的@prisma/client时,优先使用service_1本地node_modules里的版本,而两个项目的Prisma Client因数据库不同生成的类型完全不一致,从而触发类型错误。
可行解决方案
方案1:预生成service_2的类型声明文件(推荐)
通过让service_2预先编译生成独立的类型声明,service_1直接导入编译后的类型,避免解析service_2的源码及其依赖:
- 修改service_2的
tsconfig.json,开启类型声明生成:
{ "compilerOptions": { "declaration": true, // 生成类型声明文件 "declarationDir": "./dist/types", // 类型文件输出目录 "emitDeclarationOnly": true, // 只生成类型,不编译JS // 保留原有其他配置(如strict、module等) } }
- 在service_2根目录执行
tsc,生成类型文件到dist/types目录。 - 修改service_2的
package.json,指定类型入口:
{ "types": "./dist/types/src/routers/index.d.ts" // 对应AppRouter的导出路径 }
- 在service_1中通过本地依赖引入service_2:
- 在service_1的
package.json添加依赖:"service_2": "file:../service_2" - 执行
npm install完成本地包链接
- 在service_1的
- 修改service_1中的类型导入语句:
import type { AppRouter } from 'service_2'
此时TypeScript会直接使用service_2预生成的类型,不会再解析其源码,自然不会混用Prisma Client版本。
方案2:调整service_1的模块解析规则,强制service_2使用自身依赖
如果不想用本地包的方式,可通过TypeScript的模块解析配置,让service_2的代码优先使用自身目录下的node_modules:
- 修改service_1的
tsconfig.json:
{ "compilerOptions": { "moduleResolution": "node16", // 启用Node.js 16+的模块解析规则 "baseUrl": "./", "paths": { "/*": ["./*"], "service_2/*": ["../service_2/src/*"] // 配置service_2的路径别名 }, // 保留原有其他配置 }, "exclude": [ "**/node_modules/*", "**/dist/*", "**/.git/*" // 不要把service_2加入exclude,否则类型导入会失效 ] }
- 修改service_1中的类型导入语句:
import type { AppRouter } from 'service_2/routers/index'
node16模块解析规则会让TypeScript在解析service_2的文件时,优先查找service_2目录下的node_modules,从而使用正确的Prisma Client版本。
方案3:仅检查service_1自身代码(临时 workaround)
如果只需要保证service_1自身代码的类型正确,可临时跳过service_2代码的检查:
执行类型检查命令时,显式排除service_2的源码:
tsc -p ./tsconfig.json --noEmit --exclude '../service_2/**/*'
注意:此方法可能导致导入的类型缺失部分校验,仅适合临时场景。
为什么之前的尝试无效
rootDir/rootDirs:仅控制编译输出目录和模块解析根路径,无法改变跨项目依赖的node_modules优先级。@ts-ignore/@ts-nocheck:只能跳过单行或单个文件的检查,无法批量处理,且会丢失类型提示。- 将
service_2加入exclude:会导致TypeScript无法解析导入的AppRouter类型,触发"找不到模块"的错误。
内容的提问来源于stack exchange,提问作者Ben Grant
相关产品推荐
相关产品推荐

