Angular2中如何导出模块下的类?导出遇模块识别错误求助
解决“导入的不是模块”报错问题
你遇到的核心问题是TypeScript旧命名空间语法和ES模块导入系统不兼容。你的代码用的是TypeScript早期的module关键字(也就是现在的命名空间Namespace),但你尝试用ES模块标准的import语句来导入,这两种模块机制无法混用,所以才会抛出“导入的不是模块”的错误。
下面给你两种可行的解决思路:
方案一:改用ES模块语法(推荐)
现在TypeScript官方更推荐使用ES模块,这也是前端生态的标准做法,修改步骤如下:
- 调整你的实体文件(比如
_RegistrationHelper.ts),去掉module包裹,直接导出类:
/// <reference path="sensor_location.ts" /> export class _RegistrationHelper { static register(metadataStore) { // 如果sensor_location也是命名空间形式,建议同步改成ES模块导出 metadataStore.registerEntityTypeCtor('sensor_location', LATS.DataModel.sensor_location); } }
如果sensor_location.ts同样是命名空间写法,记得也改成ES模块:在sensor_location.ts里添加export class sensor_location { ... },然后在_RegistrationHelper.ts里用import { sensor_location } from './sensor_location'替换原有的命名空间访问方式。
- 修正导入语句,现在就能正常使用ES模块的
import了:
import { _RegistrationHelper } from '../entities/_RegistrationHelper';
方案二:保留命名空间(兼容旧代码)
如果因为历史项目原因必须保留命名空间语法,那就不能用import语句,而是通过TypeScript的引用指令关联文件,直接通过命名空间访问:
- 在需要使用
_RegistrationHelper的文件顶部添加引用指令:
/// <reference path="../entities/_RegistrationHelper.ts" />
- 直接通过命名空间访问类,无需
import:
LATS.DataModel._RegistrationHelper.register(yourMetadataStore);
额外配置提示
检查你的tsconfig.json,确保module选项设置匹配你的模块方案:如果用ES模块可以设为"ESNext"或"CommonJS",同时moduleResolution设为"NodeNext"或"Node",这样TypeScript才能正确解析模块导入逻辑。
内容的提问来源于stack exchange,提问作者Alois
相关产品推荐
相关产品推荐

