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

Gro*_*fit 125 module public access-modifiers typescript

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

module some.namespace.here
{
   export class SomeClass{..}
}
Run Code Online (Sandbox Code Playgroud)

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

var someVar = new some.namespace.here.SomeClass();
Run Code Online (Sandbox Code Playgroud)

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

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

module some.namespace.here
{
   public class SomeClass{..}
}
Run Code Online (Sandbox Code Playgroud)

Fen*_*ton 164

主要原因是export匹配ECMAScript的计划.你可以争辩说"他们应该使用"导出"而不是"公开",但是"导出/私有/受保护"是一组不匹配的访问修饰符,我相信这两者之间存在细微差别.

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

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

所以在概念上,能见度由控制publicprivate仅仅是工具,而export关键字改变输出.


Rya*_*ugh 47

史蒂夫芬顿的回答中添加了一些内容:

  • export 已经意味着两件不同的事情(取决于它是否处于顶层); 使它意味着三分之一可能比添加public/ 更糟糕private
  • 绝对不是要使实施更容易; 复杂性的增加publicVS export实在是微不足道.我们已经改变了一堆关键词; 这并不困难.
  • 类成员的默认可见性必须是公开的,以与ES6类提议保持一致,因此我们需要一些关键字来表示"不公开".export(unexport??)没有合适的反义词,private逻辑选择也是如此.一旦你有了private,不选择public它作为对手将是有点疯狂
  • 使用export修改内部模块的可见性是与ES6模块的最佳猜测对齐

  • 我编写了关于易于实现的厚脸皮陈述并提供+1作为道歉:) (5认同)
  • "没有合适的出口反义词(未出口?)" - 出口的合适反义词应该是禁运. (5认同)
  • 如何使用`import`来表示"此值是*未导出*"是否适合使用关键字? (3认同)
  • 我同意您的某些说法,但不同意“没有合适的反义词要导出”的说法-“ import”是反义词,并且是TypeScript的用法,在定义可导出类时,您会将其导入到其他文件中。导出类用户{名称:字符串}。 /docs.nativescript.org/angular/tutorial/ng-chapter-3 (2认同)