カテゴリ: TypeScript 更新日: 2025/12/05

TypeScriptでimplementsを使ってクラスにインターフェースを適用する方法

TypeScriptでimplementsを使ってクラスにインターフェースを適用する方法
TypeScriptでimplementsを使ってクラスにインターフェースを適用する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、TypeScriptでクラスを作るときに、インターフェースを適用できるって聞いたんですが、どういう意味ですか?」

先生

「いい質問ですね。TypeScriptでは、implementsというキーワードを使うと、クラスがインターフェースのルールに従うように強制できます。」

生徒

「なるほど。クラスがインターフェースに従うって、どういうイメージですか?」

先生

「たとえば、『契約書』のようなイメージです。インターフェースが契約書で、クラスはその契約に従って具体的に働く人、という感じですね。」

1. インターフェースとクラスの関係を理解しよう

1. インターフェースとクラスの関係を理解しよう
1. インターフェースとクラスの関係を理解しよう

まず、インターフェース(interface)とは、プログラムの中で「このオブジェクトやクラスには、最低限この性質や機能を持たせてね」とルールを決める仕組みです。あくまで「設計図」や「契約書」のようなものなので、中身の処理までは書きません。

一方で、クラス(class)は実際の設計図を元に作られる「製品」や「実働する仕組み」です。クラスは、インターフェースが決めた約束を守って処理を実装します。TypeScriptでimplementsを使うと、クラスがインターフェースに従うことを保証できます。

2. implementsを使った基本的な書き方

2. implementsを使った基本的な書き方
2. implementsを使った基本的な書き方

それでは、実際にTypeScriptでimplementsを使ってみましょう。例えば「動物」というインターフェースを作り、そのルールを守る「犬クラス」を定義します。


interface Animal {
    name: string;
    speak(): void;
}

class Dog implements Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    speak(): void {
        console.log(this.name + "がワンと鳴きました!");
    }
}

const myDog = new Dog("ポチ");
myDog.speak();

実行結果は次のようになります。


ポチがワンと鳴きました!

ここで重要なのは、DogクラスがAnimalインターフェースで決められたnameプロパティとspeakメソッドを必ず持っている点です。これを守らないとコンパイルエラーになります。

3. インターフェースを守らなかった場合のエラー

3. インターフェースを守らなかった場合のエラー
3. インターフェースを守らなかった場合のエラー

もしクラスがインターフェースで決められたルールを守らないとどうなるでしょうか? 実際に試してみます。


interface Animal {
    name: string;
    speak(): void;
}

class Cat implements Animal {
    name: string;

    constructor(name: string) {
        this.name = name;
    }

    // speak()メソッドを実装していない!
}

このコードを実行すると、TypeScriptは次のようなエラーを出します。


Class 'Cat' incorrectly implements interface 'Animal'.
Property 'speak' is missing in type 'Cat' but required in type 'Animal'.

つまり、インターフェースに書かれているルールを全て実装しないと、クラスはコンパイルエラーになります。これにより、大規模なプログラムでもルール違反がすぐにわかり、バグを防ぐことができます。

4. 複数のインターフェースを同時にimplementsする

4. 複数のインターフェースを同時にimplementsする
4. 複数のインターフェースを同時にimplementsする

クラスは一度に複数のインターフェースをimplementsできます。たとえば「動物」と「ペット」のインターフェースを同時に適用できます。


interface Animal {
    name: string;
    speak(): void;
}

interface Pet {
    owner: string;
}

class Dog implements Animal, Pet {
    name: string;
    owner: string;

    constructor(name: string, owner: string) {
        this.name = name;
        this.owner = owner;
    }

    speak(): void {
        console.log(this.name + "がワンと鳴きました!飼い主は" + this.owner + "です。");
    }
}

const myDog = new Dog("ポチ", "太郎");
myDog.speak();

ポチがワンと鳴きました!飼い主は太郎です。

このように、クラスは複数の役割を同時に持つことができます。これにより柔軟な設計が可能になります。

5. implementsを使うメリット

5. implementsを使うメリット
5. implementsを使うメリット

最後に、TypeScriptでimplementsを使うメリットを整理しましょう。

  • ルールを守らせる:クラスが必要なプロパティやメソッドを必ず持つことを保証できます。
  • 可読性が上がる:プログラムを読む人が「このクラスはどんな契約に従っているのか」をすぐ理解できます。
  • エラーを早期に発見できる:実行前にコンパイル時点でミスを見つけられるので安心です。
  • 複数の役割を組み合わせられる:複数のインターフェースを同時に適用して、柔軟に設計できます。

まとめ

まとめ
まとめ

TypeScriptでクラスにインターフェースを適用するためのimplementsという仕組みについて学んできましたが、振り返ってみると、この機能は大規模な開発でも小さなプログラムでも役に立つとても重要な考え方であることがわかります。まず、インターフェースという存在はただの設計図ではなく、クラスが守るべき約束や基本方針を示す指針であり、プログラム全体の秩序を保つ役割を担っています。クラス側はその約束に従って具体的な動作を実装するため、同じインターフェースを共有する複数のクラスが登場した場合でも、統一された書き方で処理が進むため、読みやすく理解しやすいコードへとつながります。

また、implementsを使う最大の強みは「決められた機能を必ず実装するように強制できる」という点にあります。要求されたプロパティやメソッドを忘れてしまうとコンパイルエラーが発生するため、ミスを未然に防ぐ効果が非常に高く、初心者だけでなく経験豊富な開発者にとっても安心感を与える仕組みとなっています。特に大規模な開発環境では、担当者が異なっても共通の仕様に従ってコードを書けることが求められるため、インターフェースを用いた開発は非常に重要な意味を持ちます。

さらに、複数のインターフェースを同時にimplementsすることにより、一つのクラスが複数の役割を兼ね備える柔軟な設計が可能になります。実際のアプリケーション開発では、一つのオブジェクトがいくつもの責務を持つことは珍しくありません。そのような場面で、それぞれをインターフェースとして分離し、必要に応じて組み合わせることで、より見通しのよい設計が実現できます。分かりやすく言えば、クラスが複数の契約書を同時に受け取り、それぞれの契約内容を忠実に実行するようなイメージです。

これらの特徴をさらに深く理解するために、簡単な応用例を示しておきます。次のサンプルでは、二つの異なるインターフェースをクラスへ適用し、それぞれの契約に沿った動作を実装しています。インターフェースが持つ柔軟性と堅牢性が、どのようにしてコードへ反映されるのかを確認することができます。


interface Runner {
    run(): void;
}

interface Walker {
    walk(): void;
}

class Person implements Runner, Walker {
    run(): void {
        console.log("走っています");
    }

    walk(): void {
        console.log("歩いています");
    }
}

const human = new Person();
human.run();
human.walk();

このように、インターフェースを組み合わせて機能を構築することで、クラスはさまざまな振る舞いを持つ柔軟な存在になります。実装の内容は自由でありながら、最低限満たすべき仕様はしっかり保てるという性質は、TypeScriptの強力な型システムの恩恵そのものです。インターフェースを正しく活用することで、開発者は安心してコードを書き進めることができ、さらに保守性の高いプログラムを作ることができます。

先生と生徒の振り返り会話

生徒

「implementsって最初はむずかしそうに見えたけど、契約書みたいなものだと考えるとすごく理解しやすかったです!」

先生

「そのとおりです。インターフェースは約束で、クラスはその約束をまじめに守る存在だと思えばイメージがつかみやすくなりますよ。」

生徒

「複数のインターフェースを組み合わせられるのも便利ですね。いろいろな役割をまとめて表現できるのがいいと思いました。」

先生

「ええ、実際の開発でも一つのクラスが複数の責務をもつことはよくあります。そういうとき、役割ごとに分けて考えられるのはとても助かるんですよ。」

生徒

「今日の内容を踏まえると、インターフェースってコードを整理するだけじゃなくて、より安全でわかりやすいプログラムを書くための大切なしくみなんですね!」

先生

「その気づきが一番大事です。これからクラスを作るときには、まずインターフェースをどう活かせるか考えてみるとよいですよ。」

関連記事:
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理
New2
JavaScript
JavaScriptのfor文の書き方を初心者向けにやさしく解説
New3
JavaScript
JavaScriptの関数でよくあるエラーとその解決法まとめ
New4
JavaScript
JavaScriptのイベント処理でよくあるエラーとその対処法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのマウスイベントの使い方(click, mouseoverなど)
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptのtoStringとString関数の違いを初心者向けに解説
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptで文字列をforループで1文字ずつ処理する方法!初心者向け解説
No.7
Java&Spring記事人気No7
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】