Skip to content

defer

スコープを抜けるときにコールバックを実行する Disposable オブジェクトを作成します。

typescript
using cleanup = defer(callback);

使用法

defer(callback)

スコープの終わりにクリーンアップコードを自動で実行したいときに defer を使います。返されたオブジェクトを using 宣言で宣言すると、エラーでスコープを抜ける場合でも、ブロックの終了時にコールバックが実行されます。

typescript
import { defer } from 'es-toolkit/util';

function processFile() {
  const file = openFile('data.txt');
  using cleanup = defer(() => file.close());

  // この関数が戻るかエラーを投げると、ファイルは自動的に閉じられます。
  return file.read();
}

同じスコープに複数の using 宣言がある場合、コールバックはスタックのように宣言の逆順で実行されます。

typescript
import { defer } from 'es-toolkit/util';

function run() {
  using first = defer(() => console.log('first'));
  using second = defer(() => console.log('second'));
  console.log('body');
}

run();
// 'body'、'second'、'first' の順に出力されます。

using 宣言を使うには、TypeScript 5.2 以上と、Explicit Resource Management をサポートするランタイム(Node.js 24 以上、最新のブラウザ)が必要です。古い環境では、構文をトランスパイルして Symbol.dispose のポリフィルを追加すると使用できます。

非同期のクリーンアップには deferAsync を使ってください

この関数はコールバックを同期的に実行します。クリーンアップコードが非同期で、完了を待つ必要がある場合は、deferAsync 関数を await using と一緒に使ってください。

パラメータ

  • callback (() => void): オブジェクトが破棄されるときに実行するクリーンアップ関数です。

戻り値

(Disposable): 破棄されるときに callback を実行するオブジェクトを返します。

MIT ライセンスの下で配布されています。