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


136

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

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

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

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

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

这将产生如下结果代码:

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

Answers:


176

主要原因是export与ECMAScript的计划相匹配。您可能会争辩说“他们应该使用“导出”而不是“公共”,但是“导出/私有/受保护”的辅助功能是一组不匹配的访问修饰符,我相信两者之间存在细微的差异,可以解释这一点。 。

在TypeScript中,将类成员标记为生成的JavaScript publicprivate对生成的JavaScript不起作用。它只是一个设计/编译时工具,您可以使用它来阻止TypeScript代码访问其不应该访问的内容。

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

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


1
感谢您提供的信息,我认为该决定是按照您所说的,以避免必须检查关键字的上下文,这很可惜,因为感觉它会使某些人绊倒,并且在行为上确实没有逻辑上的区别对于您期望公众采取的行动,只是使他们的实施更加容易。
Grofit

谢谢你 挽救我的头发。
肯特·阿吉拉尔

1
如果使用模块,则很有必要。如果您的应用程序偏大,那么与创建大型包/预先加载所有文件相比,模块通常是更好的选择。
芬顿

@芬顿(Fenton)你不是说“你可以说他们应该使用'公共'而不是'出口'吗?
艾伦·

@AlanEvangelista当然也可以这样争论,特别是如果您的背景是Java / C#而不是JavaScript。
Fenton

49

史蒂夫·芬顿的答案需要补充以下几点:

  • export 已经意味着两件事(取决于它是否在顶层);表示三分之一可能比添加public/ 更糟糕private
  • 绝对不是要使实现更容易。publicvs 的增加的复杂性export是微不足道的。我们已经更改了许多关键字。这并不困难。
  • 班级成员的默认可见性必须是公开的才能与ES6班级提案保持一致,因此我们需要一些关键字来表示“不公开”。exportunexport??)没有合适的反义词,因此private逻辑上的选择也是这样。一旦拥有private,不选择public它的对应对象将有些疯狂
  • 使用export来修改内部模块中的可见性是与ES6模块的最佳结合

1
感谢您提供额外的信息,我完全同意处于成员级别的公共/私人用户,我只是发现不足以在所有级别的访问中感到奇怪。但是,这只是个人观点,关键字是关键字,只是想了解更多信息。
Grofit

5
我修改了有关易于实施的厚脸皮声明,并为此道歉+1 :)
Fenton

2
我同意您的某些说法,但不同意“没有合适的反义词要导出”的声明-“ import”是反义词,并且是TypeScript的用法,在定义可导出类时,您会将其导入到其他文件中 export class User { name: string } 另一个文件: import {User} from ""./the_file_path_to_the_user_class; 请参见nativescript文档的3.3部分,此处docs.nativescript.org/angular/tutorial/ng-chapter-3
Adam Diament

3
如何将使用import表示“这个值是不出口 ”是一个合适的使用关键字的?
Ryan Cavanaugh

5
“没有合适的反义词来导出(unexport ??)”-合适的反义词应该是禁运。
rsp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.