TypeScript配置module为none时如何在命名空间内定义函数
无模块场景下在TypeScript命名空间中引入函数的方法
报错核心原因
当tsconfig中配置"module": "none"时,TypeScript会将所有工程文件解析为全局脚本,禁止使用文件顶层的ES模块级import/export语法,违规就会触发TS1148错误。
需要注意:命名空间内部用来控制成员对外可见性的export属于命名空间语法范畴,本身不属于被禁止的模块级语法,正常使用不会触发报错。如果报错指向命名空间内的export语句,优先检查文件中是否存在误写的顶层模块导入导出语句,清理后即可正常编译。
可行实现方案
方案1:命名空间内部export(官方推荐写法)
直接在命名空间内部用export修饰需要对外暴露的函数即可,该写法在module:none模式下完全合法,编译后会生成全局可访问的命名空间对象:
namespace Java { export function version() { return "java8"; } } namespace JavaScript { function JavaVer() { // 跨命名空间可直接访问已导出的成员 return Java.version(); } }
方案2:直接挂载属性到命名空间
如果有特殊规则限制不能在命名空间块内写export,可以通过声明合并+属性挂载的方式实现,效果和方案1完全一致:
// 先声明命名空间的成员类型,避免TS报属性不存在错误 namespace Java { interface Java { version: () => string } } // 定义空命名空间 namespace Java {} // 直接给命名空间对应的全局对象挂载方法 Java.version = function() { return "java8"; } namespace JavaScript { function JavaVer() { return Java.version(); } }
报错参考

内容的提问来源于stack exchange,提问作者Cflowe Visit
相关产品推荐
相关产品推荐

