如何在TypeScript命名空间中导入另一个命名空间(ASP.NET Razor项目)
问题解决:命名空间中import引用模块导致的错误
你遇到的错误提示为:命名空间中的import声明不能引用模块,根源是你在TypeScript命名空间内部混用了ES模块的import语法,两种模块系统无法这样兼容。
以下是两种可行的解决方案:
方案一:纯TypeScript命名空间方案(不使用ES模块)
这种方式延续你原本的命名空间思路,调整代码避免ES模块语法:
- 修改
file2.ts,移除export关键字,让namespace2成为全局命名空间:
namespace namespace2 { export class Class2 { constructor(){} public sayHi(){ console.log("Hi"); } } }
- 修改
file1.ts,仅通过reference指令关联文件,直接在命名空间内使用全局的namespace2:
///<reference path="./file2.ts" /> export namespace namespace1 { export class Class1 { constructor(){} public sayHello(){ console.log("Hello"); } // 示例:调用namespace2中的Class2 public callNamespace2() { const class2Instance = new namespace2.Class2(); class2Instance.sayHi(); } } }
注意:编译时需将tsconfig.json中的module配置设为none,确保使用TypeScript的全局模块系统。
方案二:改用ES模块方案(推荐,符合现代JS规范)
放弃TypeScript旧版命名空间,使用标准ES模块的导出导入逻辑:
方式1:直接导出类(更简洁)
file2.ts:
export class Class2 { constructor(){} public sayHi(){ console.log("Hi"); } }
file1.ts:
import { Class2 } from './file2'; export class Class1 { constructor(){} public sayHello(){ console.log("Hello"); } public callClass2() { const class2Instance = new Class2(); class2Instance.sayHi(); } }
方式2:保留命名空间结构(在ES模块内导出)
如果需要保留命名空间的层级结构,可将命名空间作为ES模块的导出成员,将import放在命名空间外部:
file2.ts:
export namespace namespace2 { export class Class2 { constructor(){} public sayHi(){ console.log("Hi"); } } }
file1.ts:
import { namespace2 } from './file2'; export namespace namespace1 { export class Class1 { constructor(){} public sayHello(){ console.log("Hello"); } public callNamespace2() { const class2Instance = new namespace2.Class2(); class2Instance.sayHi(); } } }
内容的提问来源于stack exchange,提问作者codaholic
相关产品推荐
相关产品推荐

