You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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的源码及其依赖:

  1. 修改service_2的tsconfig.json,开启类型声明生成:
{
  "compilerOptions": {
    "declaration": true,         // 生成类型声明文件
    "declarationDir": "./dist/types",  // 类型文件输出目录
    "emitDeclarationOnly": true, // 只生成类型,不编译JS
    // 保留原有其他配置(如strict、module等)
  }
}
  1. 在service_2根目录执行tsc,生成类型文件到dist/types目录。
  2. 修改service_2的package.json,指定类型入口:
{
  "types": "./dist/types/src/routers/index.d.ts" // 对应AppRouter的导出路径
}
  1. 在service_1中通过本地依赖引入service_2:
    • 在service_1的package.json添加依赖:"service_2": "file:../service_2"
    • 执行npm install完成本地包链接
  2. 修改service_1中的类型导入语句:
import type { AppRouter } from 'service_2'

此时TypeScript会直接使用service_2预生成的类型,不会再解析其源码,自然不会混用Prisma Client版本。

方案2:调整service_1的模块解析规则,强制service_2使用自身依赖

如果不想用本地包的方式,可通过TypeScript的模块解析配置,让service_2的代码优先使用自身目录下的node_modules:

  1. 修改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,否则类型导入会失效
  ]
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:20:41