その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

TypeScriptのMap<K, V>をJSON.stringify()に食わせると空のオブジェクトになって困るんですけどって時

(TypeScriptに限らずJavaScriptでもだいたいこのような感じだと思いますが)

例えば以下のようなコードを書くと,出力としては {"body":{}} が得られます.

const body = new Map<string, string>().set("foo", "bar");
console.log(JSON.stringify({body}));

本当は {"body": {"foo": "bar"}} のような構造がほしいところにこれでは困るわけですね.

そこでどうするかと言うと Object.fromEntries() を利用すると良い:

developer.mozilla.org

2019年11月現在だと比較的新しい機能ですね.

const body = new Map<string, string>().set("foo", "bar");
console.log(JSON.stringify({body: Object.fromEntries(body)}));

このようにするとめでたく {"body": {"foo": "bar"}} という構造が得られる.ヤッター!!

これはid:sugyanさんに教えていただきました.ありがとうございます!

なお注意点としては以下のとおりです

  • node 12以降のバージョン (もしくは対応ブラウザ) が必要.MDNのページでサポート状況をご確認ください.
  • tsconfigのlibの指定に es2019 を指定する必要あり

以上です.助かりましたね.

[追記]
JavaScriptの場合について記す (環境はnode v12.13.0).

const body = new Map().set("foo", "bar");
console.log(JSON.stringify({body})); // => {}
const body = new Map().set("foo", "bar");
console.log(JSON.stringify({body: Object.fromEntries(body)})); // => {"body": {"foo": "bar"}}

同じような感じですね.
[追記ここまで]

以下はやり取りのおまけです.