为什么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中,将类成员标记为public
或private
对生成的JavaScript没有影响。 这只是一个devise/编译时工具,您可以用它来阻止您的TypeScript代码访问它不应该的东西。
使用export
关键字,JavaScript添加一行来将导出的项目添加到模块。 在你的例子中: here.SomeClass = SomeClass;
。
所以在概念上,由public
和private
控制的可视性仅仅是工具,而export
关键字则会改变输出。
史蒂芬芬顿的答案增加了几件事情:
-
export
已经意味着两个不同的东西(取决于它是否在顶层)。 使其意味着三分之一可能比添加public
/private
更糟糕 - 这绝对不是让执行更容易;
public
vsexport
增加的复杂性是微不足道的。 我们已经改变了一堆关键字, 这并不难。 - 类成员的默认可见性必须公开才能与ES6类提案保持一致,因此我们需要一些关键字来表示“不公开”。 没有合适的反义词
export
(unexport
export
??),所以private
是合乎逻辑的select。 一旦你有了private
,就不会selectpublic
作为其对手 - 使用导出来修改内部模块的可见性是ES6模块的最佳预测
实际上,这是为了Node.js的兼容性。
如果你看下面的代码:
export function foo(){ }
你得到:
function foo(){ } exports.foo = foo;
这是Node语法。