147

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

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

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

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

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

这将产生如下代码:

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

2 回答 2

186

主要原因是export与 ECMAScript 的计划相匹配。您可能会争辩说“他们应该使用”export”而不是“public”,但除了“export/private/protected”是一组匹配不佳的访问修饰符之外,我相信两者之间存在细微的差异可以解释这一点.

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

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

因此从概念上讲,可见性由工具控制public并且private仅用于工具,而export关键字会更改输出。

于 2013-04-02T10:00:07.930 回答
52

史蒂夫芬顿的回答有几点要补充:

  • export 已经意味着两种不同的东西(取决于它是否在顶级);让它意味着三分之一可能比添加public/private
  • 绝对不是为了让实现更容易;publicvs增加的复杂性export是微不足道的。我们已经更改了很多关键字;这并不难。
  • 类成员的默认可见性必须是 public 以符合 ES6 类提案,因此我们需要一些关键字来表示“不公开”。export( unexport??)没有合适的反义词,因此private是合乎逻辑的选择。一旦你有了,不选择作为它的对手private会有点疯狂。public
  • 使用export修改内部模块的可见性是与 ES6 模块的最佳对齐方式
于 2013-04-02T14:56:33.677 回答