インターフェイス

インターフェイスは、実行時のJSの影響がゼロです。 TypeScriptのインターフェイスには、変数の構造を宣言するための多くのパワーがあります。

次の2つは同等の宣言で、1つ目はインラインアノテーションを使用し、2つ目はインターフェイスを使用します。

// Sample A
declare var myPoint: { x: number; y: number; };
// Sample B
interface Point {
x: number; y: number;
}
declare var myPoint: Point;

ただし、サンプルBの優れた点は、誰かがmyPointライブラリの上に新しいメンバーを追加するライブラリを作成した場合、既存のmyPointの宣言に簡単に追加できることです:

// Lib a.d.ts
interface Point {
x: number; y: number;
}
declare var myPoint: Point;
// Lib b.d.ts
interface Point {
z: number;
}
// Your code
var 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 };
}
}
// Because
const crazy = new CrazyClass(); // crazy would be {hello:123}

あなたはそこにあるすべての狂ったJSをインターフェイスによって宣言でき、それらを TypeScript から安全に使うこともできる。 ただし、それらを実装するためにTypeScriptのクラスを使用できるわけではありません。

コメントを残す

メールアドレスが公開されることはありません。