MyClass.ts
class MyClass { constructor() { } } export = MyClass;
MyFunc.ts
function fn() { return 0; } export = fn;
MyConsumer.ts
import * as MC from './MyClass'; import * as fn from './MyFunc'; fn();
这使我尝试使用新的错误
Module “MyClass” resolves to a non-module entity and cannot be imported using this construct.
当尝试调用fn()
Cannot invoke an expression whose type lacks a call signature.
是什么赋予了?
解决方法
import * as MC from './MyClass';
这是ES6 / ES2015风格的导入语法.其确切含义是“从./MyClass加载的模块命名空间对象并将其本地用作MC”.值得注意的是,“模块命名空间对象”仅由具有属性的普通对象组成. ES6模块对象不能作为一个函数或新的被调用.
再说一遍:ES6模块命名空间对象不能作为一个函数或新的调用.
使用*作为X从模块导入的东西被定义为只具有属性.在下级的CommonJS中,这可能不会被完全尊重,但是TypeScript会告诉你标准定义的行为.
什么工作?
您需要使用CommonJS风格的导入语法才能使用此模块:
import MC = require('./MyClass');
如果您同时控制这两个模块,可以使用导出默认值:
MyClass.ts
export default class MyClass { constructor() { } }
MyConsumer.ts
import MC from './MyClass';
我很伤心规则是愚蠢的
这将是很好的使用ES6导入语法,但现在我必须这样做导入MC = require(‘./ MyClass’);事情?这是2013年!瘸!但悲伤是编程的正常部分.请跳到库伯勒 – 罗斯模型的第五阶段:验收.
这里的TypeScript告诉你这不工作,因为它不起作用.有一些黑客(为MyClass添加一个命名空间声明是一种流行的方式来假装这个工作),并且它们今天可能在你的特定的下级模块绑定器(例如汇总)中工作,但这是虚幻的.在野外没有任何ES6模块实现,但永远不会是真的.
展现未来的自我,试图运行在一个neato本机ES6模块实现,并发现您已经设置了自己的重大失败,尝试使用ES6语法来做一些ES6显然不做的事情.
我想利用我的非标准模块加载器
也许你有一个模块加载器,当没有存在时,“有帮助”创建默认导出.我的意思是,人们为了理由而制定标准,但忽略标准是有趣的,我们可以认为这是一件很酷的事情.
将MyConsumer.ts更改为:
import A from './a';
并指定allowSyntheticDefaultImports命令行或tsconfig.json选项.
请注意,allowSyntheticDefaultImports根本不会更改代码的运行时行为.它只是一个告诉TypeScript的标志,当不存在时,您的模块加载器创建默认导出.它不会神奇地使您的代码工作在nodejs以前没有.