インターフェイスは、実行時のJSの影響がゼロです。 TypeScriptのインターフェイスには、変数の構造を宣言するための多くのパワーがあります。
次の2つは同等の宣言で、1つ目はインラインアノテーションを使用し、2つ目はインターフェイスを使用します。
// Sample Adeclare var myPoint: { x: number; y: number; };// Sample Binterface Point {x: number; y: number;}declare var myPoint: Point;
ただし、サンプルBの優れた点は、誰かがmyPoint
ライブラリの上に新しいメンバーを追加するライブラリを作成した場合、既存のmyPoint
の宣言に簡単に追加できることです:
// Lib a.d.tsinterface Point {x: number; y: number;}declare var myPoint: Point;// Lib b.d.tsinterface Point {z: number;}// Your codevar myPoint.z; // Allowed!
これはTypeScriptのインターフェースがオープンエンドであるためです。 これは、インターフェースを用いてJavaScriptの拡張性を模倣することを可能にするという、TypeScriptの重要な信条なのです。
クラスはインターフェイスを実装できる
誰かが interface
で宣言したオブジェクト構造に従う必要があるクラスを使用したい場合、implements
キーワードを使って互換性を確保することができる。
interface Point {x: number; y: number;}class MyPoint implements Point {x: number; y: number; // Same as Point}
基本的に implements
がある場合、外部の Point
インターフェイスに変更があると、コードベースでコンパイルエラーになるので、簡単に同期させることができます。e.:
var foo: Point = new MyPoint();
そして foo: Point = MyPoint
のようなものは同じものではありません。
すべてのインタフェースが簡単に実装できるわけではない
インタフェースは JavaScript で存在しうる任意のおかしな構造を宣言するために設計されたものである。
何かが new
で呼び出せる次のようなインターフェイスを考えてみましょう:
interface Crazy {new (): {hello: number};}
あなたは本質的に次のようなものを持っているでしょう:
class CrazyClass implements Crazy {constructor() {return { hello: 123 };}}// Becauseconst crazy = new CrazyClass(); // crazy would be {hello:123}
あなたはそこにあるすべての狂ったJSをインターフェイスによって宣言でき、それらを TypeScript から安全に使うこともできる。 ただし、それらを実装するためにTypeScriptのクラスを使用できるわけではありません。