为什么它不起作用
import * as MC from './MyClass';
这是 ES6/ES2015 风格的import
语法。这的确切含义是“获取从中加载的模块名称空间对象./MyClass
并在本地使用它作为MC
”。值得注意的是,“模块命名空间对象”仅由具有属性的普通对象组成。ES6 模块对象不能作为函数或使用new
.
再说一遍:不能将 ES6 模块命名空间对象作为函数或使用new
.
import
您从模块中使用的东西* as X
被定义为只有属性。在降级的 CommonJS 中,这可能没有被完全尊重,但 TypeScript 告诉你标准定义的行为是什么。
有什么作用?
你需要使用 CommonJS 风格的导入语法来使用这个模块:
import MC = require('./MyClass');
如果您控制这两个模块,则可以export default
改用:
MyClass.ts
export default class MyClass {
constructor() {
}
}
我的消费者.ts
import MC from './MyClass';
我为此感到难过;规则是愚蠢的。
使用 ES6 导入语法会很好,但现在我必须做这import MC = require('./MyClass');
件事吗?这是2013年!瘸!但悲伤是编程的正常部分。请跳至 Kübler-Ross 模型的第五阶段:接受。
这里的 TypeScript 告诉你这是行不通的,因为它行不通。有一些技巧(添加namespace
声明MyClass
是一种流行的方式来假装它有效),它们今天可能在您特定的降级模块捆绑器(例如汇总)中工作,但这是虚幻的。目前还没有任何 ES6 模块实现,但这不会永远如此。
想象一下你未来的自己,试图在一个整洁的原生 ES6 模块实现上运行,并发现你已经通过尝试使用 ES6 语法来做一些 ES6 明确不做的事情,从而使自己面临重大失败。
我想利用我的非标准模块加载器
也许您有一个模块加载器,它在不存在时“有用地”创建default
导出。我的意思是,人们制定标准是有原因的,但有时忽略标准很有趣,我们可以认为这是一件很酷的事情。
将MyConsumer.ts更改为:
import A from './a';
并指定allowSyntheticDefaultImports
命令行或tsconfig.json
选项。
请注意,这allowSyntheticDefaultImports
根本不会改变代码的运行时行为。它只是一个标志,告诉 TypeScript 你的模块加载器default
在不存在时创建导出。它不会神奇地让你的代码在 nodejs 中工作,而之前它没有。