TypeScript ~基礎編~ インターフェース

こんにちは。KOUKIです。

本記事では、TypeScriptのインターフェースについて、その概念や使い方をまとめています。

TypeScriptの初学者にとって有益な情報となっていると思いますので、是非ご一読ください^^

学習まとめ

環境構築

以下の記事で作成したプロジェクトを使います。
※TypeScriptが動けば問題ありません

インターフェースとは

TypeScriptのインターフェースは、「オブジェクトがどんな形であるか」定義するためのものです。

インターフェースを定義するためには、「interface」キーワードを用います。

インターフェースは、構造を定義するためのものです。それは、「新しい型」を作り出しているのと同義です。

そのため、これを使ってオブジェクトの型チェックができます。

book1には、Bookインターフェースを型定義しました。これにより、book1は、インターフェースに定義されているプロパティやメソッドを全て実装する必要があり、どれか一つでも実装が漏れていた場合は、エラーが発生します。

定義漏れの際のエラー

インターフェースの実装

インターフェースが必要な理由

KOUKI
KOUKI

インターフェースが必要な理由は、以下の通りだと思います。

インターフェースが必要な理由 1: プロパティやメソッドを強制的に実装させることができる
2: 共通の機能を複数のクラスに渡って実装させることができる
3: 型として定義すると意図したプロパティやメソッドを持っていることを担保できる

詳しく見ていきましょう。

以前、カスタム型というものを学びました。

カスタム型は、「type」キーワードを使って、自分が定義したい新しい型を作り出すことができます。

先ほどのインターフェースも以下のように書き換えることができます。

これでもオブジェクトの型チェックができます。インターフェースとカスタム型は基本的には同じなのです。

では、何故インターフェースがあるのでしょうか。

一つの違いとして、インターフェースは、「オブジェクトの構造を定義することだけ」できます。カスタム型はオブジェクト型以外にもユニオン型などTypeScriptの様々な型を定義することができます。

つまりインターフェースを使うことは、「オブジェクトの型を定義する」という意図を明確に開発者に伝えることができます。

また、インターフェースはクラスに対して、実装を行うことができます。

実装を行うためには、「implements」キーワードを使います。

尚、インターフェースは、クラスに対して複数割り当てることができます。

そして、インターフェースを実装したクラスは、インターフェースに定義したプロパティやメソッドを必ず実装する必要があります。

加えて、クラスには、インターフェースにはない新しいプロパティやメソッドも追加できるのです。

インターフェースは、「具体的な実装に関係なく複数のクラスで同じ機能を持たせるとき」に便利ですね。抽象クラス(abstract)と少し似ています。

抽象クラスは、インターフェースと違って、抽象メソッドも具体的なメソッドも両方定義できます。また、クラスは一つのクラスのみ継承できます。

インターフェースを実装したクラスは、以下のように宣言できます。

このようにReviewableを型として変数に宣言すると、reviewメソッドを持つオブジェクトのみ変数に代入できるので、代入したオブジェクトは確実にreview関数を持つことになります。

これは、開発者にとって非常に便利に感じる機能なんです。

インターフェースを読み取り専用にする

インターフェースのプロパティに「readonly」キーワードをつけると読み取り専用にできます。

インターフェースの継承

クラスと同様にインターフェースも継承を使うことができます。

それには、クラスと同様に「extends」キーワードを用います。

インターフェースを分けると、あるオブジェクトでは「Reviewable/Revieweeの機能が両方必要」、「他のオブジェクトではRevieweeの機能だけ必要」、など用途ごとに実装することが可能になります。

また、クラスとは違いインターフェースは複数のインターフェースを継承することができます

インターフェースを関数の型として定義する

インターフェースは、関数の型としても定義できます。

ちなみに、カスタム型(type)でも同じことができます。

オブジェクトの定義ではないので、この場合はカスタム型を使うことが一般的のようです。

インターフェースとカスタム型使い分け! ・オブジェクトの型を定義したい -> インターフェースを用いる
・オブジェクト以外の型を定義したい -> カスタム型を用いる
KOUKI
KOUKI

使い分けは、あくまで目安です。状況によっては異なるかもしれません。

インターフェースで任意のプロパティを設定する

インターフェースに任意のプロパティを設定することができます。

そのためには、「?」を使います。

任意のプロパティとは、実装先でこのプロパティを設定しなくてもエラーにならないという意味です。上記の例では、likeはつけてもつけなくてもOKということです。

クラスにも任意のプロパティを設定できますが、その場合はインターフェースのプロパティも任意のプロパティとする必要があります。

おわりに

以上がインターフェースの概要と実装方法です。

インターフェースは、実装したクラスにプロパティやメソッドを強制することができます。また、オブジェクトがどのような構造であるか定義することができます。

とても強力な機能です。使いこなしてきましょう^^

インターフェースは、Go言語やJavaでも出てくるので、ここで理解すると他の言語でも理解が進みますよ!

それでは、また!

参考書籍