从自建npm包导入类时NestJS报‘cannot find module’错误
我有一个包含NestJS、NextJS及共用类定义npm包的单体仓库,文件夹结构如下:
/rr-admin /rr-admin-frontend /rr-admin-backend /rr-admin-models
这个rr-admin-models包用于定义前后端共用的类,包内index.d.ts内容:
export class StudentRequest { firstName: string; lastName: string; status: "Active" | "Finished" | "Stopped"; group: number; } export class StudentResponse extends StudentRequest { id: number; createdAt: Date; updatedAt: Date; }
包的package.json内容:
{ "name": "@rr-admin/models", "version": "1.0.0", "types": "./index.d.ts", }
我已经在NestJS项目中安装了@rr-admin/models包,且它存在于node_modules中,但通过import { StudentRequest } from "@rr-admin/models";导入类时,NestJS终端提示Cannot find module '@rr-admin/models'。
将class改为type或interface时不会报错,但这样就无法使用class-validator(它仅支持类)。另外,修改npm包中的类导致与数据库类型不匹配时,终端会提示类型不匹配,说明文件已经被读取。
请问如何将自建npm包中的类导入到NestJS项目中?
1. 补充npm包的运行时入口配置
.d.ts文件仅提供类型声明,无法提供Node.js可执行的运行时代码。当导入class时,Node.js需要对应的JS实现文件,这是当前报错的核心原因。
修改rr-admin-models的package.json,添加main字段指定JS入口(后续需要生成对应的JS文件):
{ "name": "@rr-admin/models", "version": "1.0.0", "types": "./index.d.ts", "main": "./index.js" }
2. 迁移类定义并编译为可执行JS
.d.ts文件不应包含实际class实现(class需要运行时存在),需按以下步骤处理:
- 将
index.d.ts重命名为index.ts - 在
rr-admin-models目录初始化TypeScript配置:tsc --init - 修改
tsconfig.json关键配置,确保生成可运行的JS和对应的类型文件:{ "compilerOptions": { "target": "ES2020", "module": "CommonJS", "declaration": true, // 自动生成.d.ts类型文件 "outDir": "./dist", // 编译产物输出目录 "strict": true }, "include": ["index.ts"] } - 执行编译命令生成产物:
tsc - 更新
package.json的路径指向编译后的文件:{ "name": "@rr-admin/models", "version": "1.0.0", "types": "./dist/index.d.ts", "main": "./dist/index.js" }
3. 同步本地包的最新产物
如果是通过npm link或monorepo工具(如pnpm/yarn workspace)安装的包:
- 在
rr-admin-models目录执行编译命令(可把编译命令加到package.json的scripts中,方便后续执行) - 重新在NestJS项目中安装或链接包,确保最新编译产物同步到
node_modules
4. 验证NestJS的TypeScript配置
检查NestJS项目的tsconfig.json,确保moduleResolution设置正确,保证包能被正常解析:
{ "compilerOptions": { "moduleResolution": "Node" } }
内容的提问来源于stack exchange,提问作者Sunny Feelgood

