TypeScript の WeakMap は、JavaScript 標準の WeakMap を型安全に扱うためのものです。
参考 : https://ja.javascript.info/weakmap-weakset
string や number は使えない(object | function | symbol 系が必要)。for...of や .keys() などはない。
(中身を全部見たい用途では使えない)// WeakMap<キー型, 値型>
const wm = new WeakMap<object, string>();
const obj = {};
wm.set(obj, "hello");
console.log(wm.get(obj)); // "hello"
type Data = { id: number; name: string };
const cache = new WeakMap<object, Data>();
function getData(obj: object): Data {
if (cache.has(obj)) {
return cache.get(obj)!;
}
const data = { id: Math.random(), name: "user" };
cache.set(obj, data);
return data;
}
const key = {};
console.log(getData(key)); // 生成されてキャッシュ
console.log(getData(key)); // キャッシュから取得
key が GC で消えると、自動で cache からも消える。
Map と違って「キーが生存している限り値を保持、消えれば自動削除」という点が最大のメリット。ざっくり言えば 「オブジェクトをキーにした隠しデータ置き場。しかもキーが死ねば勝手に消える」
要するに、
Map は「使う人が明示的に管理するキャッシュ」
WeakMap は「GC に任せるキャッシュ」