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つのみ継承できますが、インターフェースは複数を同時に実装できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。