テクノロジー

私がTypeScriptで `interface` よりも `type` を好む理由 - kosui

1: soulfulmiddleagedman 2025/10/24 10:11

私も何度も調べてるなぁ。

2: ka-ka_xyz 2025/10/24 10:19

tsのinterfaceをマージする仕様は個人的にかなりダメなやつだと思う(拡張が必要なら普通に extendsで良さそうな

3: Fushihara 2025/10/24 10:44

既存のライブラリの型を追いかけている時も、interfaceで書かれているとこの型の定義はこういう意味だ と確定的に調べる事が出来なくなるんだよね

4: yash268925 2025/10/24 11:10

tsの型は構造的部分型なのだから、そもそも「○○しかもたない」という思い込みが危険なのでは。type Userにしていようが、いらんもの(hashedPassword)が入っててもUserで通るし。

5: turanukimaru 2025/10/24 11:26

TSは型で宣言していないものを持っていることが多いのと、内部構造をそのままAPIの外に出すのは内部構造を変更しにくくなるので明示的に出力データを作ったほうが良いと思うが。DBアクセス後のEntityは特に色々入りがち

6: hatest 2025/10/24 11:29

拡張可能なことを意図する場合はinterface 、拡張できない型を意図する場合はtypeで使い分けてるな。メンバーには「型を宣言する時は、まず基本typeで宣言してもらって、拡張可能にするならinterfaceに変えてくれ」と言う

7: jintrick 2025/10/24 12:20

"私が指摘したいのは、「型定義ファイルを見に行くだけでは、その型が最終的にどのような形状になるか断定できない」という interface の特性そのものが持つリスクです"

8: akymrk 2025/10/24 12:31

“アプリケーションのデータ構造」である、APIのレスポンス、DBのエンティティ、ドメインオブジェクトなどを定義する際には、その型が「閉じている(closed)」こと、つまり「定義ファイルに書かれているプロパティがす

9: daketake 2025/10/24 17:31

言語設計どおりインターフェースにあたるものはinterface、型にあたるものはtypeで書くだけだよ。下手に代用しようとすると疲弊するだけだと思うな

10: dbr0 2025/10/24 18:16

interfaceの宣言のマージ、一見非合理だけど既存の組み込みオブジェクトをprototype拡張してるJSライブラリを使う時にこれが無いと詰む場合があるんだよな。anyと同じで積極的に使うべきで無いが必要悪な機能だと思ってる。

11: repon 2025/10/24 18:41

今日ChatGPTに「typeよりinterfaceが良いんでしょ?」って訊いたら叱られが起きた

12: hylom 2025/10/24 21:50

そもそもインターフェイスはそこで宣言されているプロパティやメソッドを持っていることを保証するためのものなんだけどTSにおいてはクラスやデータ型を宣言するもののように認識されているのではないか問題

13: daichirata 2025/10/24 23:37

意図としてはもちろんそうなんだけどパフォーマンス的に実利をとってinterface使うみたいな話じゃなかったっけ

14: Xibalba 2025/10/27 11:06

とてもわかりやすい