きり丸の技術日記

技術検証したり、資格等をここに残していきます。

JavaScript(TypeScript)のMapでgerOrElseと同等の動きを簡潔に書く

JavaだとMapのvalueを取得する際に、取得できなかった場合のデフォルト値を返すgetOrElseメソッドが用意されていますが、JavaScriptにはありません。今回の記事では、その同等の挙動を簡潔に書けるようにします。

環境

対応

Null合体演算子(??)を組み合わせれば、getOrElseと同等の挙動させられます。

// Mapの定義
const actionMap: Map<String, number> = new Map<String, number>([
  ["a", 1],
  ["b", 2],
  ["c", 3]
]);
// 取得できなければ0を返却する
const result: number = actionMap.get("a") ?? 0;

getOrThrow

getOrElseはデフォルト値を返すためのメソッドです。似たメソッドに、データが取得できなかった場合にエラーを返すgetOrThrowがあります。

同様にgetOrThrowも実行できないか確認していましたが、次のエラーメッセージが出力されて、簡潔に実装することは難しそうです。

Support for the experimental syntax 'throwExpressions' isn't currently enabled

素直にifで処理分岐するしかなさそうです。

function getValue3(actionMap: Map<String, number>, key: String): number {
  const result: number | undefined = actionMap.get(key);
  if (result == null) {
    throw new Error("Error");
  }
  return result;
}

ソースコード

終わりに

TypeScriptだと型定義が必要ですので、分かる範囲では1行にまとめてしまいたいですね。

型定義は非必須ですが、警告が出ているままコーディングしていると本当に大事な警告を見逃してしまいますので、できる範囲ではキッチリ作業していきたいです。

参考情報