言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

TypeScript辞典

  1. トップページ
  2. TypeScript辞典
  3. implements

implements

対応: TypeScript 1.0(2014)

『implements』を使うと、クラスがインターフェースの定義を満たしているかをコンパイル時に検証できます。インターフェースで決めた「形」をクラスが正しく実装しているかを TypeScript が保証します。

構文

interface InterfaceName {
  property: Type;
  method(arg: Type): ReturnType;
}

class ClassName implements InterfaceName {
  property: Type;
  method(arg: Type): ReturnType { /* ... */ }
}

// 複数のインターフェースを同時に実装
class ClassName implements InterfaceA, InterfaceB { /* ... */ }

サンプルコード

interface Serializable {
  serialize(): string;
  deserialize(data: string): void;
}

interface Loggable {
  log(): void;
}

class User implements Serializable, Loggable {
  constructor(public name: string, public age: number) {}

  serialize(): string {
    return JSON.stringify({ name: this.name, age: this.age });
  }

  deserialize(data: string): void {
    const obj = JSON.parse(data);
    this.name = obj.name;
    this.age = obj.age;
  }

  log(): void {
    console.log(`User: ${this.name}, Age: ${this.age}`);
  }
}

const user = new User('user_1', 23);
const json = user.serialize();
console.log(json); // {"name":"user_1","age":23}
user.log(); // User: user_1, Age: 23

// インターフェースを型として使う(ポリモーフィズム)
function saveToStorage(item: Serializable): void {
  const data = item.serialize();
  localStorage.setItem('data', data);
}

saveToStorage(user); // User は Serializable を実装しているため渡せる

実行すると次のように出力されます。

npx ts-node ts_implements.ts
{"name":"user_1","age":23}
User: user_1, Age: 23

概要

『implements』はあくまで型チェックのための仕組みです。インターフェースのコードがクラスに自動で追加されるわけではなく、クラス側で必ず実装を提供する必要があります。実装が不足している場合は、コンパイルエラーとして検出されます。

インターフェースを使うと、異なるクラスを共通の型(インターフェース型)として扱えます。上記の例では、『Serializable』を実装しているクラスであれば何でも『saveToStorage』に渡せます。これにより、具体的なクラスへの依存を減らした柔軟な設計が実現できます。

抽象クラス と異なり、インターフェースは実行時に存在しません。また、クラスは抽象クラスを1つのみ継承できますが、インターフェースは複数を同時に実装できます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。