やりたかったこと
↓のような、型とメソッドが既存のソースにありましたが、このメソッドに対し、似てるけどちょっと違う型も引数に渡せるようにする必要がありました。(プロパティ名が異なる)
理由としては、型が違ってもほぼ同じ処理なので、わざわざ別々のメソッドを作るのも気が引けたためです。
interface IfX{
propA: string;
propB: string;
}
func(param: IfY) {
// なんらかの処理
}
そのため、このような感じで型の追加と、引数の修正を行いました。
interface IfA{
propA: string;
propB: string;
}
interface IfB{
propC: string;
propD: string;
}
func(paramX: IfX | paramY: IfY) {
// なんらかの処理
}
ただ、このメソッドは、プロパティに依存した処理を行なうので、このままでは使用することができませんでした。
そのため、型による条件分岐をする必要がありました。
方法
以前、たまたま見かけた下の記事のことを記憶していたので、見返してみましたが、型名用のプロパティを追加して、タグのようなものとして使用し、それにより条件分岐する方法でした。
しかしながら、今回の場合は、既に設計書があり、プロパティを追加することができないため、この方法は使用できませんでした。
で、調べた結果、in演算子でできそうということで、inを使って実装しました。
具体例
func(paramX: IfX | paramY: IfY) {
if('propA' in paramX ) {
// 型IfX用のなんらかの処理
}
if('propC' in paramY) {
// 型IfY用のなんらかの処理
}
}
'propA' in paramX
の意味ですが、paramXの型がIfXで、propAというプロパティをもっていればtrue、もっていなかければfalseとboolean型で返します。これで型による条件分岐ができました。