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

从自建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:10:13