Custom Type GuardよりもUnion Type
code:ts
type Resp1 = {
hoge: number
}
type Resp2 = {
fuga: string
}
function func(): Resp1 | Resp2 {
...
}
const v = func();
v.hoge // エラー
v.fuga // エラー
こういうコードがあったときに、呼び出し側でResp1とResp2を判別しないといけなくなるわけだが、返り値がobjectであるのでそのままでは型分岐させることができない
こういう場合Custom Type Guardを定義することになるのだが、実は書き方を工夫することで必要なくなる
code:ts
type Resp1 = {
type: "resp1"
hoge: number
}
type Resp2 = {
type: "resp2"
fuga: string
}
function func(): Resp1 | Resp2 {
...
}
const v = func();
if (v.type === "resp1") {
v.hoge //エラーにならない
} else {
v.fuga // エラーにならない
}
ポイントはUnion Typeの要素同士にオーバーラップしたプロパティを生やすところ
こうすることで、呼び出し側ではオーバーラップしたプロパティだけ解決が可能で、その値が重複しないものであれば、if文で分岐させることが出来る