私も何度も調べてるなぁ。
tsのinterfaceをマージする仕様は個人的にかなりダメなやつだと思う(拡張が必要なら普通に extendsで良さそうな
既存のライブラリの型を追いかけている時も、interfaceで書かれているとこの型の定義はこういう意味だ と確定的に調べる事が出来なくなるんだよね
tsの型は構造的部分型なのだから、そもそも「○○しかもたない」という思い込みが危険なのでは。type Userにしていようが、いらんもの(hashedPassword)が入っててもUserで通るし。
TSは型で宣言していないものを持っていることが多いのと、内部構造をそのままAPIの外に出すのは内部構造を変更しにくくなるので明示的に出力データを作ったほうが良いと思うが。DBアクセス後のEntityは特に色々入りがち
拡張可能なことを意図する場合はinterface 、拡張できない型を意図する場合はtypeで使い分けてるな。メンバーには「型を宣言する時は、まず基本typeで宣言してもらって、拡張可能にするならinterfaceに変えてくれ」と言う
"私が指摘したいのは、「型定義ファイルを見に行くだけでは、その型が最終的にどのような形状になるか断定できない」という interface の特性そのものが持つリスクです"
“アプリケーションのデータ構造」である、APIのレスポンス、DBのエンティティ、ドメインオブジェクトなどを定義する際には、その型が「閉じている(closed)」こと、つまり「定義ファイルに書かれているプロパティがす
言語設計どおりインターフェースにあたるものはinterface、型にあたるものはtypeで書くだけだよ。下手に代用しようとすると疲弊するだけだと思うな
interfaceの宣言のマージ、一見非合理だけど既存の組み込みオブジェクトをprototype拡張してるJSライブラリを使う時にこれが無いと詰む場合があるんだよな。anyと同じで積極的に使うべきで無いが必要悪な機能だと思ってる。
今日ChatGPTに「typeよりinterfaceが良いんでしょ?」って訊いたら叱られが起きた
そもそもインターフェイスはそこで宣言されているプロパティやメソッドを持っていることを保証するためのものなんだけどTSにおいてはクラスやデータ型を宣言するもののように認識されているのではないか問題
意図としてはもちろんそうなんだけどパフォーマンス的に実利をとってinterface使うみたいな話じゃなかったっけ
とてもわかりやすい
私がTypeScriptで `interface` よりも `type` を好む理由 - kosui
私も何度も調べてるなぁ。
tsのinterfaceをマージする仕様は個人的にかなりダメなやつだと思う(拡張が必要なら普通に extendsで良さそうな
既存のライブラリの型を追いかけている時も、interfaceで書かれているとこの型の定義はこういう意味だ と確定的に調べる事が出来なくなるんだよね
tsの型は構造的部分型なのだから、そもそも「○○しかもたない」という思い込みが危険なのでは。type Userにしていようが、いらんもの(hashedPassword)が入っててもUserで通るし。
TSは型で宣言していないものを持っていることが多いのと、内部構造をそのままAPIの外に出すのは内部構造を変更しにくくなるので明示的に出力データを作ったほうが良いと思うが。DBアクセス後のEntityは特に色々入りがち
拡張可能なことを意図する場合はinterface 、拡張できない型を意図する場合はtypeで使い分けてるな。メンバーには「型を宣言する時は、まず基本typeで宣言してもらって、拡張可能にするならinterfaceに変えてくれ」と言う
"私が指摘したいのは、「型定義ファイルを見に行くだけでは、その型が最終的にどのような形状になるか断定できない」という interface の特性そのものが持つリスクです"
“アプリケーションのデータ構造」である、APIのレスポンス、DBのエンティティ、ドメインオブジェクトなどを定義する際には、その型が「閉じている(closed)」こと、つまり「定義ファイルに書かれているプロパティがす
言語設計どおりインターフェースにあたるものはinterface、型にあたるものはtypeで書くだけだよ。下手に代用しようとすると疲弊するだけだと思うな
interfaceの宣言のマージ、一見非合理だけど既存の組み込みオブジェクトをprototype拡張してるJSライブラリを使う時にこれが無いと詰む場合があるんだよな。anyと同じで積極的に使うべきで無いが必要悪な機能だと思ってる。
今日ChatGPTに「typeよりinterfaceが良いんでしょ?」って訊いたら叱られが起きた
そもそもインターフェイスはそこで宣言されているプロパティやメソッドを持っていることを保証するためのものなんだけどTSにおいてはクラスやデータ型を宣言するもののように認識されているのではないか問題
意図としてはもちろんそうなんだけどパフォーマンス的に実利をとってinterface使うみたいな話じゃなかったっけ
とてもわかりやすい