TypeScriptのinterfaceとtypeがいつの間にかほとんど同じになっていた

気づいたきっかけは下の記事。

interfaceとtypeの違い、そして何を使うべきかについて

昔の仕様

以前のtypeは、「新しい名前を作らない」という仕様があった。
たとえば、コンパイルエラーの出力には元の型名が表示されていた。

Type aliases don’t create a new name — for instance, error messages won’t use the alias name.

(https://medium.com/@martin_hotell/interface-vs-type-alias-in-typescript-2-7-2a8f1777af4c)

他にもtypeはextends/implementsできないという仕様もあったりして、なかなかに使いにくかった。

そのような状況だったので、基本的にはinterfaceを使い、それでは表せない型にだけtypeを使っていた。
今はもうほとんど差がなくなっていたなんて…

今後の方針

interfaceは同じ名前で複数回定義して拡張できるという仕様があるけど、これいる…?
最初に紹介した記事にも書かれている通り、混乱のもとにしかならない気がする。
これからは表現力の高いtypeをメインに使っていきたい。