在尝试使用Typescript时,我意识到模块中的类(用作名称空间)不可用于其他类,除非我在它们之前编写export
关键字,例如:
module some.namespace.here
{
export class SomeClass{..}
}
所以现在我可以使用上面的代码:
var someVar = new some.namespace.here.SomeClass();
但是我只是想知道为什么使用这个关键字而不是仅仅使用在方法级别使用的public
关键字来表示方法或属性应该可以从外部访问。那么为什么不使用相同的机制使类和接口等在外部可见呢?
这会产生如下结果的代码:
module some.namespace.here
{
public class SomeClass{..}
}
答案 0 :(得分:151)
主要原因是export
与ECMAScript的计划相匹配。你可以争辩说“他们应该使用”出口“而不是”公开“,但是”出口/私人/受保护“是一套不太匹配的访问修饰符,我相信这两者之间有一个微妙的区别来解释这个
在TypeScript中,将类成员标记为public
或private
对生成的JavaScript没有影响。它只是一个设计/编译时工具,可用于阻止TypeScript代码访问它不应该访问的东西。
使用export
关键字,JavaScript会添加一行以将导出的项目添加到模块中。在您的示例中:here.SomeClass = SomeClass;
。
因此,从概念上讲,public
和private
控制的可见性仅适用于工具,而export
关键字会更改输出。
答案 1 :(得分:44)
史蒂夫芬顿回答的一些内容:
export
已经意味着两件事(取决于它是否处于顶层);使它意味着三分之一可能比添加public
/ private
public
vs export
的复杂性增加是微不足道的。我们已经改变了一堆关键词;这并不困难。export
(unexport
??)没有合适的反义词,因此private
是合理的选择。获得private
后,如果不选择public
作为对手export
修改内部模块的可见性是与ES6模块最佳对齐