自分のAngularプロジェクトのコードを書いているときにふと、
「classとinterfaceの違いってなんだろう」と思いました。
わかるような気もするけど、言葉でちゃんと説明できないな…と思ったので自分用に調べてまとめてみました。
参考にしたのはこちら:
Classes vs Interfaces in TypeScript
TypeScriptのstaticアクセス修飾子を使う時理解する4つの事
#Class
TypeScriptでは、ES6で正式にJSに導入されたClassを型チェックとstaticプロパティを用いてより強力に使うことができるものです。つまり、Classはトランスパイル後のコードにもそのまま残りますClassはオブジェクトを生成する設計図のようなもので、クラスプロパティを初期化し、メソッドを定義することで実装されます。Classのインスタンスを生成すると、利用できるメソッド・決められたプロパティを持ったオブジェクトが手に入るというわけです。
Classにはstaticメソッドやstaticプロパティをもたせることができます。staticメソッドのすごいところは、インスタンスを作ることなくメソッドを利用できるところです。また、staticプロパティは同じClassから生成されたインスタンス間で共有されます。Class名.プロパティ/メソッド名で呼び出します。staticメソッドやプロパティを付与することでSingleton的に、そうでないものをもたせることでファクトリー的に利用することができます。
#Interface
InterfaceはClassと異なり、TSでのみ存在する仮想構造です。TSコンパイラーが型チェックのためだけに利用するので、コンパイル後には残らず、もちろん利用されることはありません。Interfaceはただただオブジェクトが持つべきプロパティの名前と型を約束するだけのものです。
#まとめ(感想)
staticは使ったことがなかったので今回いろいろ調べてみて驚くことが多かったです。
個人的には、
- Interfaceはとりあえず開発者が「typeをあるInterfaceに設定したものは必ずある名前である型のプロパティを持っている」と安心して作業を進められるようにするために機械的に設定するもの
- クラスはインスタンスごとにイメージの想像がつくもの、持つ情報の集合体が1つの形をもつものでその形ごと受け渡しをしたい時に使うもの
といったような印象でした。
最終的に「イメージのつくもの」みたいな説明をしているのが「言葉で説明できる」というゴールを満たしているかは微妙なところですが、調べる前よりは自分の中でかなりクリアになったので今回は良しとしたいと思います。