ブログblog

typeとinterfaceの違いについて

Writer: tokuyasu 更新日:2024/05/22

こんにちは、デジナーレ福岡オフィスの徳安です。

 

今回はTypeScriptのtype と interfaceについてまとめてみました。

 

interface(インターフェース)

 

interfaceは、クラスやオブジェクトが持つ、
プロパティやメソッドを定義した型のことを指す。

 

 

type(型エイリアス)

 

typeは、型に名前を付けることができる。
名前のついた型を、型エイリアス(タイプエイリアス: type alias)と呼ぶ。

 

 

※interface では、上記のような型定義はできない。

 

typeでの型定義では、ほかにも様々な型に名前を付けることができる。

 

 

interfaceとtypeの違い

 

 

継承について

interface は、interfaceやtypeを継承することができる

 

 

typeでの型定義では、extendを使用して継承することはできない
交差型を使用することで、extendでの継承と似たものを再現することは可能

 

 

継承による上書き

 

interfaceで継承の際に、プロパティを上書き(オーバーライド)すると、
継承元のプロパティの型が上書きされる。

 

 

 

※上記では、nameの型定義をany → string に上書きされているが、
上書きできるものは、元の型に代入できるもののみ。

 

下記のように、number型であるnumberFieldを、string型で上書きすることはできない。

 

 

typeでの型定義では、上書きにならずにフィールドの型の交差型が計算される。
交差型で計算ができない場合でもコンパイルエラーにはならない

 

 

同名のものを宣言

 

interface の場合は、同じ名前のinterface を定義することができる
定義したinterfaceは、すべての宣言を合成させたものになる。

 

 

同じ名前で型定義できるということは、気づかぬうちに同じ名前で宣言し、
定義した型の中身が変わってしまうことにもなりうるので、使う際には注意する必要がある。

 

typeでの型定義では、同じ名前での型定義はできない。

 

 

Mapped Types

 

Mapped Typesは型のキーを動的に指定することができる仕組み。
オブジェクトのキーに型定義をすることが可能。

 

typeでの型定義のみで実装することができる

 

 

 

interfaceで使用するとエラーが発生する。

 

今回はinterfaceとtypeでの型定義の違いについてまとめてみました。
interfaceとtypeのどちらを使用して型定義を行うかは、
それぞれのメリットやデメリットを理解して、
プロジェクト内でルールを決め、そのルールに則って開発をするようにします。
ここまで読み進めていただきありがとうございます。