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

TypeScript导入./classes模块报错MODULE_NOT_FOUND,求解决方案

Node无法找到./classes模块的排查与解决

项目结构与代码细节

我有一个classes文件夹,包含book.ts、library.ts、person.ts以及index.d.ts文件:

  • 前三个文件均为类文件,以book.ts为例:
export default class DefaultBook implements Book {
    constructor(
        readonly id: number,
        readonly name: string,
        readonly author: string
    ) { }
}

另外两个类文件结构类似,均通过export default导出唯一类。

  • index.d.ts内容如下:
export { default as DefaultBook } from "./book";
export { default as DefaultLibrary } from "./library";
export { default as DefaultPerson } from "./person";

主文件index.ts中导入方式:

import { DefaultLibrary, DefaultBook } from "./classes"

并创建实例:

const aBook = new DefaultBook(
    12,
    "Harry Potter",
    "J. K. Rowling"
)

报错信息

执行tsc index.ts和node index.js后出现错误:

node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module './classes'

错误码为MODULE_NOT_FOUND。

关键异常线索

  • VSCode未检测到代码错误,仅编译运行时报错
  • 存在一个结构类似的types文件夹(导出命名空间和接口的类型文件,同样用export default,含index.d.ts),用相同方式导入时无问题
  • 直接通过import DefaultBook from "./classes/book";可以成功导入并使用类

已尝试的解决方案

  • 全局更新TypeScript:npm install -g typescript
  • 删除package-lock.json和node_modules后重新执行npm init
  • 在tsconfig.json的compilerOptions中设置moduleResolution: "node"
  • 在tsconfig.json中添加input: ["classes"]

核心问题分析

问题根源是**index.d.ts仅用于类型定义,不会被TypeScript编译为可执行的JS文件**。Node运行时加载模块时,会查找对应路径下的JS文件(如classes/index.js),但你的classes文件夹中只有index.d.ts,没有编译后的index.js,因此抛出找不到模块的错误。

而types文件夹能正常工作,是因为类型文件在TS编译过程中仅用于类型检查,最终会被从JS输出中移除,Node运行时不会尝试加载它,因此不会触发报错。

解决步骤

  1. 替换入口文件类型
    在classes文件夹中创建index.ts,内容与原index.d.ts一致:

    export { default as DefaultBook } from "./book";
    export { default as DefaultLibrary } from "./library";
    export { default as DefaultPerson } from "./person";
    

    若不需要对外单独暴露类型,可直接删除index.d.ts;若需要保留类型声明,可让index.d.ts从index.ts导出类型。

  2. 修正tsconfig.json配置
    修改tsconfig.json的include字段,确保覆盖classes目录下的所有文件,同时移除无效的input配置:

    {
      "compilerOptions": {
        "module": "CommonJS",
        "moduleResolution": "node",
        "outDir": "./dist" // 可选,指定编译输出目录,便于管理
      },
      "include": ["index.ts", "classes/**/*"]
    }
    
  3. 重新编译运行
    执行tsc编译所有文件,之后运行编译后的文件(如node dist/index.js,若指定了outDir),此时Node就能找到./classes对应的classes/index.js模块。

额外说明

  • 单独导入./classes/book能成功,是因为book.ts被编译成了book.js,Node可以找到对应的JS文件。
  • index.d.ts的正确用途是给JavaScript项目提供类型支持,或在TypeScript项目中声明额外的类型扩展,不能作为导出实际类/值的模块入口。

内容的提问来源于stack exchange,提问作者Matthew Basford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:20:30