在Typescript中出口和出口有什么区别?

时间:2017-07-18 14:15:06

标签: typescript

我有read他们在顶级时做同样的事情吗?但是,就我而言:

这很好用:

export class First{}
export class Second{}

但是以下错误:

class First{}
class Second{}
module.exports = exports = {First,Second}

错误:文件'文件路径 .ts'不是模块。

1 个答案:

答案 0 :(得分:1)

摘要

[密切注意以下单数export和复数exports之间的差异。它们不可互换。]

TypeScript将export ...export =都视为导出语句。 (是的,即使是第二个,看起来像一个简单的任务,实际上也被视为出口声明。)

module.exports = exports =是一对就TypeScript编译器而言没有特殊含义的赋值。这是一种在CommonJS模块中导出符号的方法。

两者都可用于导出符号(在第二种情况下需要一些解决方法来安抚编译器),但我建议在CommonJS分配上使用TypeScript export语句。

解释

TypeScript将

export ...export =视为导出语句。当我们使用它时,编译器知道您要从文件中导出一些符号。如果您尝试使用此文件在另一个TypeScript模块中导入文件,一切都很好,因为您在第一个文件中使用export ...export =会告诉TypeScript“这是一个模块”,而您已经清楚地向TypeScript指出要导出的内容。

代码module.exports = exports = ...被视为两个分配,除此之外没有特殊含义。对于TypeScript编译器,它与foo.bar = bar = ...相同。在这两种情况下,TypeScript都会对代码执行类型检查,但它不会将其视为专门导出任何内容。因此,如果您导入使用此文件的文件,您将收到您看到的错误:Error: File '...' is not a module.由于您的文件不包含任何importexport语句,因此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习语中本地使用。