为什么Typescript使用关键字“export”来公开类和接口?

当涉及Typescript的时候,我意识到模块中的类(用作名称空间)对于其他类是不可用的,除非我在它们之前写了export关键字,例如:

 module some.namespace.here { export class SomeClass{..} } 

所以现在我可以像这样使用上面的代码:

 var someVar = new some.namespace.here.SomeClass(); 

然而,我只是想知道为什么这个关键字被用来反对只使用在方法级别使用public关键字来表示方法或属性应该是外部访问。 那么为什么不使用这个相同的机制来使类和接口等在外部可见呢?

这会给结果代码如:

 module some.namespace.here { public class SomeClass{..} } 

主要原因是export符合ECMAScript的计划。 你可能会争辩说:“他们应该使用”export“而不是”public“,但是”export / private / protected“是一个访问修饰符的不完全匹配,我相信这两者之间有一个微妙的差别, 。

在TypeScript中,将类成员标记为publicprivate对生成的JavaScript没有影响。 这只是一个devise/编译时工具,您可以用它来阻止您的TypeScript代码访问它不应该的东西。

使用export关键字,JavaScript添加一行来将导出的项目添加到模块。 在你的例子中: here.SomeClass = SomeClass;

所以在概念上,由publicprivate控制的可视性仅仅是工具,而export关键字则会改变输出。

史蒂芬芬顿的答案增加了几件事情:

  • export 已经意味着两个不同的东西(取决于它是否在顶层)。 使其意味着三分之一可能比添加public / private更糟糕
  • 这绝对不是让执行更容易; public vs export增加的复杂性是微不足道的。 我们已经改变了一堆关键字, 这并不难。
  • 类成员的默认可见性必须公开才能与ES6类提案保持一致,因此我们需要一些关键字来表示“不公开”。 没有合适的反义词exportunexport export ??),所以private是合乎逻辑的select。 一旦你有了private ,就不会selectpublic作为其对手
  • 使用导出来修改内部模块的可见性是ES6模块的最佳预测

实际上,这是为了Node.js的兼容性。

如果你看下面的代码:

 export function foo(){ } 

你得到:

 function foo(){ } exports.foo = foo; 

这是Node语法。