为什么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更糟糕 - 这绝对不是让执行更容易;
publicvsexport增加的复杂性是微不足道的。 我们已经改变了一堆关键字, 这并不难。 - 类成员的默认可见性必须公开才能与ES6类提案保持一致,因此我们需要一些关键字来表示“不公开”。 没有合适的反义词
export(unexportexport??),所以private是合乎逻辑的select。 一旦你有了private,就不会selectpublic作为其对手 - 使用导出来修改内部模块的可见性是ES6模块的最佳预测
实际上,这是为了Node.js的兼容性。
如果你看下面的代码:
export function foo(){ }
你得到:
function foo(){ } exports.foo = foo;
这是Node语法。