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の計画と一致することです。 「彼らは「パブリック」の代わりに「エクスポート」を使用すべきだったが、「エクスポート/プライベート/保護」が不十分に一致するアクセス修飾子のセットであることを主張すると、これを説明する2つの間に微妙な違いがあると思う。
TypeScriptでは、クラスメンバーをpublic
またはprivate
としてマークしても、生成されたJavaScriptには影響しません。これは、設計/コンパイル時のツールであり、TypeScriptコードがアクセスしてはならないものにアクセスできないようにするために使用できます。
export
キーワードを使用すると、JavaScriptはエクスポートされたアイテムをモジュールに追加する行を追加します。あなたの例では:here.SomeClass = SomeClass;
。
したがって、概念的には、public
およびprivate
で制御される可視性は単なるツールであり、export
キーワードは出力を変更します。
スティーブフェントンの答えに追加するいくつかのこと:
export
alreadyは、2つの異なることを意味します(トップレベルかどうかによって異なります)。つまり、3分の1はpublic
/private
を追加するよりもおそらく悪いということです。public
対export
の追加された複雑さは簡単です。既に多くのキーワードを変更しました。難しくありません。export
(unexport
??)に適した反意語がないため、private
が論理的な選択です。 private
を取得したら、public
を対応しないものとして選択しないことはやや狂気になります。export
を使用することは、ES6モジュールとの最良の一致です