usingって何?
- 後片付けしてくれる
const- 変数宣言(
letとかconstとおなじ感じ) - 使い終わったら自動的にリソース解放してくれる
- 変数宣言(
予備情報
- ES2026に内定した機能
- TypeScriptではリリース済み
新しい変数宣言 using | TypeScript入門『サバイバルTypeScript』
いつ使うん?
usingの対象になるもの
- 使用後に解放処理が必要なもの
- メモリリーク、ファイル肥大化、デッドロック
- ファイルハンドル、DB接続、タイマー
try...finallyで書いていたもの- 後片付け系のコードを見つけたら
usingに置き換えられる候補
- 後片付け系のコードを見つけたら
実際に動くコードで確認
class Resource {
constructor(name) {
this.name = name;
console.log(`[open] ${this.name}`);
}
// 確認用 ⭐ブロックを抜ける時にこのメソッドを自動的に呼び出してくれる
[Symbol.dispose]() {
console.log(`[close] ${this.name}`);
}
}
function main() {
using r1 = new Resource("DB接続");
using r2 = new Resource("ファイルハンドル");
console.log("処理を実行中");
}
main();
// [open] DB接続
// [open] ファイルハンドル
// 処理を実行中
// [close] ファイルハンドル
// [close] DB接続上記のコードの処理の流れ
main()実行r1生成 → [open] DB接続r2生成 → [open] ファイルハンドルconsole.log("処理を実行中")が実行main()関数ブロックを抜けるusingで宣言された編集の[Symbol.dispose()]が宣言時と逆順で自動的に呼ばれるr2閉じられる [close] ファイルハンドルr1閉じられる [close] DB接続
リソースを解放するために、オブジェクトの
[Symbol.dispose]()メソッドが呼び出されます。
usingをfor…ofで使用する
ループが1周するたびにリソースを解放してくれる
for (using x of array)使い所
大量のリソースを1個ずつ順番に処理して、使用後すぐに解放したい
for (using file of openManyFiles(fileList)) {
processFile(file);
} // ファイルを1個処理し終わるたびに自動的に閉じる
// 全部開いてるとメモリを圧迫する最後に
便利そう。await usingもあるらしい。便利そう。