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{..}
}

回答:


176

主な理由は、exportECMAScriptの計画と一致しているためです。「パブリック」の代わりに「エクスポート」を使用する必要があったと主張することはできますが、「エクスポート/プライベート/保護」からのアクセス修飾子のセットがあまり一致していないため、これを説明する2つの間に微妙な違いがあると思います。

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

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

つまり、概念的には、可視化によって制御されpublic、それprivateは単なるツールであり、exportキーワードは出力を変更します。


1
情報のおかげで、私はあなたが言ったとおり、キーワードのコンテキストを確認する必要がないように決定したと思います。これは、数人がつまずき、動作に論理的な違いがないように感じるので、残念です。あなたが公衆にどのように行動することを期待するかに応じて、彼らの実装をより簡単にします。
Grofit 2013

これをありがとう。髪を引っ張るのを助けてくれます。
ケントアギラール

1
モジュールを使用している場合に必要です。アプリが大きい方の場合、通常、大きなバンドルを作成したり、すべてのファイルを事前に読み込んだりするよりもモジュールの方が適しています。
フェントン

@フェントンは、「彼らが「輸出」の代わりに「公衆」を使用すべきだったと主張することができたのではないですか?
アラン・エヴァンジェリスタ

@AlanEvangelistaは、特にあなたのバックグラウンドがJavaScriptではなくJava / C#である場合は、確かにそのように議論することもできます。
フェントン

49

スティーブフェントンの回答に追加するいくつかの事項:

  • export すでに 2つの異なることを意味します(トップレベルかどうかによって異なります)。3分の1は、public/private
  • 実装を容易にすることは間違いありません。publicvs の追加された複雑さexportは取るに足らないものです。たくさんのキーワードを変更しました。難しいことではありません。
  • クラスメンバのデフォルトの可視性がなければなりませんので、我々は「公共のではない」を示すために、いくつかのキーワードを必要とする、ES6クラス提案と整合するようにパブリックです。exportunexport??)には適切な反意語がないのでprivate、論理的な選択です。あなたが持っているとprivatepublicその相手として選択しないことはいくぶん狂気になるでしょう
  • export内部モジュールの可視性を変更するためのの使用は、ES6モジュールとの最良の推測の整合です

1
追加情報のおかげで、私はパブリック/プライベートがメンバーレベルにあることに完全に同意します。すべてのレベルのアクセスに十分ではないことを奇妙に思いました。ただし、これは個人的な意見であり、キーワードはキーワードです。詳細を知りたいだけです。
Grofit 2013

5
私は実装の容易さについての生意気な声明を編集し、謝罪として+1を提供します:)
Fenton

2
私はあなたが言っていることのいくつかに同意しますが、「エクスポートするのに適した反意語はありません」という文言には同意しません-「インポート」は反意語であり、TypeScriptが使用するものであり、エクスポート可能なクラスを定義するときに、それを他のファイルにインポートします export class User { name: string } 別のファイル: import {User} from ""./the_file_path_to_the_user_class; ネイティブスクリプトドキュメントのセクション3.3を参照してくださいdocs.nativescript.org/angular/tutorial/ng-chapter-3
Adam Diament

3
を使用importして「この値はエクスポートされない」ことを示すには、どのようにキーワードを適切に使用しますか
Ryan Cavanaugh

5
「エクスポートに適した反意語はありません(unexport ??)」-エクスポートに適した反意語は禁止する必要があります。
rsp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.