为什么它不起作用
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() {
}
}
我的消费者
import MC from './MyClass';
我为此感到难过;规则是愚蠢的。
使用ES6导入语法会很不错,但是现在我必须做这个import MC = require('./MyClass');
事情吗?2013年就这样!瘸!但是悲伤是编程的正常部分。请跳至库伯勒·罗斯模型的第五阶段:验收。
这里的TypeScript告诉您这不起作用,因为它不起作用。有一些hacks(namespace
向其添加声明MyClass
是一种流行的伪装方式),它们现在可能在您特定的降级模块捆绑器(例如汇总)中起作用,但这是虚幻的。目前还没有任何ES6模块实现,但这并不是永远的。
想像一下您未来的自我,尝试在一个完整的本机ES6模块实现上运行,并通过尝试使用ES6语法执行ES6明确没有做的事情来发现自己已陷入重大故障。
我想利用我的非标准模块加载器
也许您有一个模块加载器,default
当不存在导出器时会“有帮助”地创建导出。我的意思是,人们制定标准是有原因的,但是忽略标准有时很有趣,我们可以认为这是一件很酷的事情。
将MyConsumer.ts更改为:
import A from './a';
并指定allowSyntheticDefaultImports
命令行或tsconfig.json
选项。
请注意,这allowSyntheticDefaultImports
根本不会改变代码的运行时行为。它只是一个标志,告诉TypeScript当模块加载器default
不存在时,它会创建导出。以前没有,它不会神奇地使您的代码在nodejs中工作。
javascript
作为主要标签并离开ecmascript-6
,因为这里的主要标签是typescript
。该问题错误地假定export =
(TS功能)可以与配对import ... from
,而应该与配对import =
。与CJS / AMD相比,基本上是ES6模块的导入/导出。