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

时间:2013-04-02 09:22:21

标签: typescript module public access-modifiers

在尝试使用Typescript时,我意识到模块中的类(用作名称空间)不可用于其他类,除非我在它们之前编写export关键字,例如:

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

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

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

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

这会产生如下结果的代码:

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

2 个答案:

答案 0 :(得分:151)

主要原因是export与ECMAScript的计划相匹配。你可以争辩说“他们应该使用”出口“而不是”公开“,但是”出口/私人/受保护“是一套不太匹配的访问修饰符,我相信这两者之间有一个微妙的区别来解释这个

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

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

因此,从概念上讲,publicprivate控制的可见性仅适用于工具,而export关键字会更改输出。

答案 1 :(得分:44)

史蒂夫芬顿回答的一些内容:

  • export 已经意味着两件事(取决于它是否处于顶层);使它意味着三分之一可能比添加public / private
  • 更糟糕
  • 绝对不是要让实施更容易; public vs export的复杂性增加是微不足道的。我们已经改变了一堆关键词;这并不困难。
  • 类成员的默认可见性必须公开以与ES6类提案保持一致,因此我们需要一些关键字来表示“不公开”。 exportunexport ??)没有合适的反义词,因此private是合理的选择。获得private后,如果不选择public作为对手
  • ,那就太疯了
  • 使用export修改内部模块的可见性是与ES6模块最佳对齐