我有read他们在顶级时做同样的事情吗?但是,就我而言:
这很好用:
export class First{}
export class Second{}
但是以下错误:
class First{}
class Second{}
module.exports = exports = {First,Second}
错误:文件'文件路径 .ts'不是模块。
答案 0 :(得分:1)
[密切注意以下单数export
和复数exports
之间的差异。它们不可互换。]
TypeScript将export ...
和export =
都视为导出语句。 (是的,即使是第二个,看起来像一个简单的任务,实际上也被视为出口声明。)
module.exports = exports =
是一对就TypeScript编译器而言没有特殊含义的赋值。这是一种在CommonJS模块中导出符号的方法。
两者都可用于导出符号(在第二种情况下需要一些解决方法来安抚编译器),但我建议在CommonJS分配上使用TypeScript export
语句。
export ...
和export =
视为导出语句。当我们使用它时,编译器知道您要从文件中导出一些符号。如果您尝试使用此文件在另一个TypeScript模块中导入文件,一切都很好,因为您在第一个文件中使用export ...
或export =
会告诉TypeScript“这是一个模块”,而您已经清楚地向TypeScript指出要导出的内容。
代码module.exports = exports = ...
被视为两个分配,除此之外没有特殊含义。对于TypeScript编译器,它与foo.bar = bar = ...
相同。在这两种情况下,TypeScript都会对代码执行类型检查,但它不会将其视为专门导出任何内容。因此,如果您导入使用此文件的文件,您将收到您看到的错误:Error: File '...' is not a module.
由于您的文件不包含任何import
或export
语句,因此TypeScript不会将文件视为一个模块。
虽然可以编制解决方法以使用module.exports = exports = ...
导出符号,但我不建议在TypeScript代码中使用module.exports = exports = ...
。这是一种导出符号的CommonJS方式。 AMD模块 在理论上也支持它,但TypeScript编译器在发出AMD模块时默认不会显示module
。因此,无论您使用哪种混合物来使其与CommonJS一起使用,都需要为AMD进行更多的调制。现在或将来开发的其他模块格式可能根本无法处理。我将其替换为:
class First{}
class Second{}
export = {First,Second}
当您使用CommonJS时,编译器会在最后一行发出此信息:
module.exports = { First: First, Second: Second };
如果将编译器设置为发出AMD模块,它将从模块工厂返回{ First: First, Second: Second }
。并将发出适合其支持的其他模块格式的内容。
在极少数情况下,我需要使用对我正在导出的对象的本地引用,我会修改我的导出来执行此操作:
const ex = { First, Second };
export = ex;
然后ex
可以在模块中本地使用,方式exports
可以在CommonJS习语中本地使用。