为什么它不起作用
import * as MC from './MyClass';
这是 ES6/ES2015 风格import
句法。其确切含义是“将模块命名空间对象加载自./MyClass
并在本地使用它作为MC
”。值得注意的是,“模块命名空间对象“仅由具有属性的普通对象组成。ES6 模块对象不能作为函数或用new
.
再说一遍:ES6 模块命名空间对象不能作为函数调用或使用new
.
你的事import
using * 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 语法就好了,但现在我必须这样做import MC = require('./MyClass');
事物?这已经是2013年了!瘸!但悲伤是编程的正常组成部分。请跳至库伯勒-罗斯模型的第五阶段:接受。
TypeScript 在这里告诉你这不起作用,因为它不起作用。有一些技巧(添加一个namespace
声明给MyClass
是一种流行的假装这种方法有效的方法),并且他们might今天在您的特定下层模块捆绑器(例如 rollup)中工作,但这是虚幻的。目前还没有任何 ES6 模块实现,但这不会永远如此。
想象一下未来的自己,尝试在neato本机ES6模块实现上运行,并发现自己已经为重大失败做好了准备尝试使用 ES6 语法做一些 ES6 明确不做的事情.
我想利用我的非标准模块加载器
也许您有一个“有帮助”创建的模块加载器default
当不存在时导出。我的意思是,人们制定标准是有原因的,但有时忽略标准很有趣,我们可以认为这是一件很酷的事情。
Change 我的消费者.ts to:
import A from './a';
并指定allowSyntheticDefaultImports
命令行或tsconfig.json
option.
注意allowSyntheticDefaultImports
根本不会改变代码的运行时行为。它只是一个告诉 TypeScript 你的模块加载器创建的标志default
当不存在时导出。它不会神奇地让你的代码在 Nodejs 中工作,而以前却不能。