TypeScriptのOptional ChainingとNullish Coalescingを利用して、オブジェクトの末端ノードにキーがあるかチェックする

 自作ライブラリの中で、オブジェクトの子や孫などのノードがプロパティを持っているかチェックするコードがあった。
"bar" in foo && Object.keys(foo.bar).length

 ノードが子、孫、ひ孫と深くなるたびにnullガードが増えるのでしんどいコードになっていく。こいつをTypeScript 3.7で導入されたOptional ChainingNull Coalescingでスリムに書こうというところ。

 まずOptional Chainingを使うと、foo?.barと書いたときにオブジェクトfooにプロパティbarが未定義ならnullを返してくれる。foo?.bar?.doomとつなげていっても、途中で未定義プロパティになった時点でnullを返してくれる。doomまで定義されていればdoomの値を返してくれる。↑に出てきたコードに適用する。
Object.keys(foo?.bar).length

nullガードが外れた。しかしbarが未定義のとき、Object.keysにnullを渡ってしまいエラーになるので次に行く。

 Null Coalescingを使うと、"v1 ?? v2"と書いたとき、v1がnullならv2を返してくれる。三項演算子を使うようなケースをちょっと短くかける形。これをまた↑のコードに適用し、nullのときは空オブジェクトを返すようにする。
Object.keys(foo?.bar ?? {}).length

これでエラーにはならず、目的どおりにオブジェクトの末端ノードがプロパティを持っているかチェックできる。ノードを深くする手間も少なめ。
Object.keys(foo?.bar?.doom?.doon ?? {}).length

comment: 0