Open1
JavaScriptのinstanceofってやっぱり使いにくい
object instanceof Constructor
でオブジェクトがクラスのインスタンスかを調べられる。
一見便利そうだが、こういうケースもあるので使いにくい。
- プロジェクトでlibAを使っている
- libA → libBの
Foo
インスタンスを返す -
instanceof Foo
したいので、libBをプロジェクトにインストール - libAが期待するlibBのバージョンと、プロジェクトが指定したlibBのバージョンが異なるため、libBがnode_modulesに2つ存在
- 前者をlibB-1、後者をlibB-2とする
- プロジェクトで
instanceof Foo
はlibB-2のFoo
を見に行っている - しかし、libAが返す
Foo
はlibB-1のもの。 - したがって、常に
false
が返る。
プロジェクトで指定したlibBのバージョンをlibAと合わせれば一時的には解決する。しかし、libAがいつlibBのバージョンを変更するか分からないという問題もある。
instanceofに頼らず、型ガード関数で判別するのが安全。