【问题标题】:Why does Typescript use the keyword "export" to make classes and interfaces public?为什么 Typescript 使用关键字“export”来公开类和接口?
【发布时间】:2013-03-23 12:46:04
【问题描述】:

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

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

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

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

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

这将给出如下代码:

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

【问题讨论】:

    标签: typescript module public access-modifiers


    【解决方案1】:

    主要原因是export 与 ECMAScript 的计划相匹配。您可能会争辩说“他们应该使用”export”而不是“public”,但除了“export/private/protected”是一组匹配不佳的访问修饰符之外,我相信两者之间存在细微的差异可以解释这一点.

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

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

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

    【讨论】:

    • 感谢您提供的信息,我认为该决定正如您所说的那样,是为了避免检查关键字的上下文,这很遗憾,因为感觉它会让一些人绊倒并且在行为上与您期望公众的行为方式确实没有逻辑上的区别,只是使它们的实施更容易。
    • 如果你正在使用模块,这是必要的。如果您的应用程序偏大,那么模块通常是比创建大包/预先加载所有文件更好的选择。
    • @Fenton 你不是说“你可以争辩说他们应该使用 'public' 而不是 'export' 吗?
    • @AlanEvangelista 你当然也可以这样争论,尤其是如果你的背景是 Java / C# 而不是 JavaScript。
    【解决方案2】:

    Steve Fenton 的回答中要补充几点:

    • export 已经 意味着两个不同的东西(取决于它是否在顶层);让它意味着三分之一可能比添加public/private更糟糕
    • 绝对不是为了让实现更简单; publicexport 增加的复杂性是微不足道的。我们已经更改了很多关键字;这并不难。
    • 类成员的默认可见性必须公开以符合 ES6 类提案,因此我们需要一些关键字来表示“不公开”。 export (unexport??) 没有合适的反义词,所以private 是合乎逻辑的选择。拥有private 后,如果不选择public 作为其对应项,那将有些疯狂
    • 使用export 修改内部模块的可见性是与 ES6 模块的最佳对齐方式

    【讨论】:

    • 感谢您提供更多信息,我完全同意公共/私人处于会员级别,我只是觉得对于所有级别的访问都不够用很奇怪。不过这是个人观点,关键字就是关键字,只是想了解更多。
    • 我对第一个要点感到困惑。谁在建议export 应该有第三层含义?
    • 我同意你说的一些话,但我不同意“没有合适的反义词可以导出”的说法——“导入”是反义词,是 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
    • 如何使用import 表示“此值未导出”是否适合使用关键字?
    • “没有合适的反义词来出口(unexport??)”——出口的合适反义词应该是禁运。
    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 2011-04-02
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多