Open1

TypeScriptメモ

msy.msy.

interfaceとtypeと、どっち使うか問題

【参考】

【メモ書き】

  • interface では Declaration merging がされる。type ではされない
    • 同じ名前の型定義が複数ある時に、自動的に一つの定義にマージしてくれる機能
    • たまたまグローバルに定義されている型と同じ名前をつけてしまうと、拡張される
  • type では union 型や tuple 型が作れる。interface では作れない
  • interface で定義したものは index signature で定義したオブジェクトに代入できない
    • Index signature is missing in type 'TestObjectInterface'.ts(2345)
    • function test(obj: {[key: string]: string}): void;
      • このとき引数objに、typeで型を指定したオブジェクトは入れられるが、interfaceではできない
      • 実際には{[key: string]: string}以外も代入できてしまうので、interfaceのほうが堅牢

TS初期はinterfaceではできてtypeはできないことが割とあったのでinterface派が多かった。
バージョンアップしてるうちにtypeでできることがどんどん増えて、今は差がほとんどない

interfaceのほうが堅牢だが、typeは安全性を犠牲にして便利さをとっている印象。
Object型を定義したり、ライブラリ開発者が外部に公開するには、interfaceのほうが歓迎される。
(拡張しやすいため)