147

Typescript をいじっているうちに、モジュール内のクラス (名前空間として使用される) は、次のexportようにキーワードを前に記述しない限り、他のクラスで使用できないことに気付きました。

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

これで、上記のコードを次のように使用できます。

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

publicしかし、メソッドまたはプロパティが外部からアクセス可能であることを示すためにメソッドレベルで使用されるキーワードを使用するのではなく、なぜこのキーワードが使用されるのか疑問に思っていました。では、これと同じメカニズムを使用して、クラスやインターフェースなどを外部から見えるようにしてみませんか?

これにより、次のような結果のコードが得られます。

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

2 に答える 2

186

主な理由はexport、ECMAScript の計画と一致することです。「彼らは「public」ではなく「export」を使用すべきだったと主張することができますが、「export/private/protected」がアクセス修飾子の一致の少ないセットであることを除けば、これを説明する2つの間に微妙な違いがあると思います.

TypeScript では、クラス メンバーをとしてマークするpublicprivate、生成された JavaScript に影響を与えません。TypeScriptコードがアクセスすべきでないものにアクセスするのを止めるために使用できる、単なる設計/コンパイル時のツールです。

このexportキーワードを使用すると、JavaScript は、エクスポートされた項目をモジュールに追加する行を追加します。あなたの例では: here.SomeClass = SomeClass;.

したがって、概念的には、publicおよびによって制御される可視性privateは単なるツール用ですが、exportキーワードは出力を変更します。

于 2013-04-02T10:00:07.930 に答える
52

Steve Fentonの回答に追加するいくつかのこと:

  • export すでに2つの異なることを意味します(トップレベルにあるかどうかによって異なります)。3分の1を意味するようにすることは、public/を追加するよりもおそらく悪いことですprivate
  • 実装を簡単にするためではありません。publicvsの追加の複雑さexportは些細なことです。すでに多くのキーワードを変更しています。難しくありません。
  • クラス メンバーのデフォルトの可視性は、ES6 クラスの提案に合わせて public にする必要があるため、「非公開」を示すキーワードが必要ですexport( unexport??) には適切な反意語がないためprivate、論理的な選択です。を持っていると、対応するものとしてprivate選択しないのはやや正気ではありませんpublic
  • を使用exportして内部モジュールの可視性を変更することは、ES6 モジュールとの最適な連携です。
于 2013-04-02T14:56:33.677 に答える