interface
は、あなたは、単にオブジェクトの形状を記述したいときのためです。インターフェイスのコード生成はこれまでどおりではありません。タイプシステムのアーティファクトだけです。あなたはそれがimplements
句を持っているかどうかに応じて、クラスのコード生成に差は見られないだろう。あなたは、外部に存在することになるだろう既存クラス(通常は活字体クラス、常にではない)を記述したい場合(たとえば、次の2つの.jsにコンパイル2つの.TSファイルを持っているため
declare class
ですファイルは両方ともウェブページのscript
タグを介して含まれています)。あなたがextends
を使用してclass
から継承する場合は(関係なく、基本型がdeclare class
または通常class
あったかどうかの)コンパイラは、プロトタイプチェーンとフォワーディングのコンストラクタをフックするすべてのコードを生成するために行くと何をされていません。
インタフェースであったはずのdeclare class
から継承しようとすると、生成されたコードが実行時の表現を持たないオブジェクトを参照するため、ランタイムエラーが発生します。
逆に、implement
のインターフェイスがdeclare class
であった場合は、すべてのメンバーを自分で再実装する必要があります。また、コードを再利用することもできません。基底クラスで、実行時にプロトタイプチェーンをチェックする機能は、実際には、基本クラスのインスタンスではないものとして、あなたのオブジェクトを拒否します。
あなたがC++バックグラウンドを持っている場合、あなたはおおよそ厳密にこのコンパイル単位で定義を欠いコンストラクタのextern
宣言としてtypedef
としてinterface
とdeclare class
と考えることができ、本当にオタク取得します。
純粋な消費側(命令型コードを記述し、新しい型を追加しない)から、interface
との唯一の違いは、インタフェースがnew
でないことです。あなたはextend
/implement
に新しいclass
でこれらのタイプのいずれかを意図する場合は、あなたは絶対にinterface
とdeclare class
の間で正しく選択されている必要があります。それらのうちの1つだけが動作します。あなたによく機能します
つのルール:
- は、コンストラクタ関数(
new
で呼び出し可能なもの)を持つタイプの整列の名前であることが、実行時に実際に存在します(例えばDate
があるが、JQueryStatic
ではありません) ? がである場合は、間違いなくinterface
- 私は別のTypeScriptファイルのコンパイルされたクラスを扱っていますか?はい場合は、それがない場合であっても、素人の面では
declare class
参照http://stackoverflow.com/a/14323673/1704166 –
これらのどちらも、JS出力なしで同じことを達成できるため、別のものを使用することを説明するのに役立つとは思われません。 – Chris