型による条件分岐について

はてブのコメントにはポリモーフィズムすべきだ、型による分岐したら負けだ、みたいなコメントが散見されるけど、それはJavaなど静的型付けのクラスベースオブジェクト指向言語の話であって、JSはそうではない。TSはクラスベースのような顔をしてるが正体はJSなので、やはりインターフェース継承とメソッドオーバーライドによる多態性で条件分岐を隠蔽するような言語ではない。

qiita.com

Javaのようなクラスベース言語でもサブタイプ多相には限界がある。例えばドメインエラーを型で表現するということはJavaでも一般的に行われると思うけど、Webアプリケーションならば、そのドメインエラーの型によってHTTPステータスコードを切り替えなくてはならないだろう。この分岐をサブタイプ多相でやるとドメイン層のエラーオブジェクトが、自分がどのHTTPステータスコードにマップされるか知ってなくてはならない。HTTPの知識がドメイン層に入ってしまってはドメインとは・・・となってつらい

ドメイン外の挙動を分離するためにDIで制御の反転というテクニックを用いたり、非ドメインクラスに詰め替えるという処理を行ったりするが、エラー処理如きでそんなことをするのは面倒で普通に地獄だし、だったら素直に型でパターンマッチして分岐したほうがシンプルで分かりやすいわけですよ。Scalaではドメイン層の処理結果をEitherで返して、Leftだったら型を見てレスポンスのステータスコードを決定するような処理をコントローラメソッドに書いたりする。Javaでもthrowされた例外クラスの型でcatch対象選べるけど、あれも型による分岐の一種であろう。

ポリモーフィズムが常に万能というわけではないし、JSは関数オブジェクトを用いたり、コールバックとかイベントという仕組みで分岐できるので、あえてポリモーフィズムを使う必要もあまりない。