TypeScript导入.d.ts定义的类运行报模块找不到错误如何解决
问题根因
核心错误是将包含运行时实现逻辑的类写在了.d.ts类型声明文件中:
.d.ts是TypeScript专属的纯类型声明文件,TS编译时仅用它做类型校验,不会将其编译为可运行的.js文件输出到dist目录。interface是纯类型结构,编译后会被完全擦除,因此用import type导入接口时,编译后的JS代码会直接删除对应导入语句,不会触发模块查找错误。- 你导入的
BasicController、BasicService是包含具体方法实现的类,属于运行时必须存在的值,TS不会从.d.ts文件生成对应JS实现,导致编译后的layoutController.js仍保留对../types/system的导入语句,但dist目录下根本不存在对应的JS文件,运行时直接抛出模块找不到的错误。
修复方案
- 拆分类型声明与运行时代码:
- 所有纯类型结构(
Controller、Service、SetupService、DBClient接口)可以保留在system.d.ts中,也可以移到普通.ts文件中,这类内容仅用于类型校验。 - 将
BasicController、BasicService两个包含具体实现逻辑的类,从system.d.ts移到普通.ts文件中(比如直接把system.d.ts改名为system.ts,或者拆分到独立的basicController.ts、basicService.ts文件),TS编译时会自动将这类.ts文件编译为对应JS文件输出到dist目录。
- 所有纯类型结构(
- 调整导入语句:
- 纯类型的接口继续用
import type语法导入即可。 BasicController、BasicService这类运行时需要用到的类,导入路径指向你存放这些类的.ts文件即可。
- 纯类型的接口继续用
- 遵守文件规范:
.d.ts文件仅可存放类型相关内容(接口、类型别名、模块/变量类型声明),禁止写入类实现、函数实现、变量初始化这类需要运行时执行的逻辑。你当前tsconfig开启了declaration: true,普通.ts文件编译时会自动生成对应的.d.ts类型文件,无需手动在.d.ts里写运行时代码。
内容的提问来源于stack exchange,提问作者bkkoli
相关产品推荐
相关产品推荐

