NestJS中Prisma生成类型未进dist目录,ts-rest共享类型报错
问题:NestJS编译后Prisma生成的类型未复制到dist目录,导致MODULE_NOT_FOUND错误
我在开发NestJS后端,使用Prisma操作数据库,Prisma生成类型的配置如下:
generator clientTypes { provider = "prisma-client-js" output = "../ts-rest/types/generated/client" }
通过ts-rest实现前后端类型共享,需要从Prisma导入枚举:
import { CUSTOMER_TYPE } from "ts-rest/types/generated/client";
编译时出现MODULE_NOT_FOUND错误,换成@prisma/client路径能解决后端报错,但前端无法使用这个路径。使用nest start --watch直接编译代码,排查发现编译后Prisma生成的类型未被复制到dist/ts-rest目录,导致编译后的代码找不到该类型。已尝试修改nest-cli.json:
"compilerOptions": { "assets": ["ts-rest/types/generated/**/*"] }
但问题依旧,想知道原因和解决办法。
原因分析
- NestJS
assets配置的局限性:默认情况下,assets仅负责复制非TypeScript文件(如.json、.prisma),Prisma生成的.ts类型文件会由TypeScript编译器单独处理,不会走assets复制逻辑。 - TypeScript编译范围未覆盖生成目录:自定义的Prisma输出路径不在
tsconfig.json的include范围内,导致编译时这些类型文件未被纳入输出目录。
解决方案
方案1:调整TypeScript配置,纳入生成的类型文件
修改tsconfig.json,将Prisma生成的类型目录加入include数组,确保TypeScript编译时将其输出到dist目录:
{ "compilerOptions": { // 原有编译配置 }, "include": [ "src/**/*", "ts-rest/types/generated/**/*" // 新增该行,覆盖Prisma生成的类型文件 ] }
方案2:完善nest-cli.json的资产监听配置(针对非TS文件)
如果生成目录中包含.json等非TS元数据文件,需要开启watchAssets确保开发模式下文件同步:
{ "compilerOptions": { "assets": ["ts-rest/types/generated/**/*"], "watchAssets": true // 新增,监听资产文件变化并同步到dist } }
注意:该配置仅处理非TS文件,TS文件仍需依赖方案1的tsconfig配置。
方案3:调整Prisma生成路径(可选)
将Prisma生成的类型放到src目录下,利用默认的tsconfig规则自动纳入编译:
generator clientTypes { provider = "prisma-client-js" output = "../src/prisma/generated/client" }
此时导入路径改为:
import { CUSTOMER_TYPE } from "../prisma/generated/client";
验证步骤
- 执行
prisma generate重新生成类型文件 - 运行
nest build手动编译,检查dist/ts-rest/types/generated(或对应调整后的路径)是否存在编译后的文件 - 启动
nest start --watch,验证枚举导入是否正常
内容的提问来源于stack exchange,提问作者benoit
相关产品推荐
相关产品推荐

