[學習筆記] TypeScript 的 Using 與 Symbol.dispose

介紹

TypeScript 在 5.2 引入了一個新關鍵字 using - 可用於在離開作用域時使用 Symbol.dispose 函數處理任何內容。

看一下官方的說明

TypeScript 5.2 introduces support for the forthcoming Explicit Resource Management feature in ECMAScript,
which aims to address the need for “cleaning up” after creating an object.
This feature allows developers to perform necessary actions such as closing network connections,
deleting temporary files, or releasing memory.

usingawait 的目的在於釋放資源上會非常有用。

在舉例子之前先看一下新的全域 Symbol:Symbol.disposeSymbol.asyncDispose,
任何將函數分配給 Symbol.dispose 的物件都將被視為「資源」(“具有特定存留期的物件”),並且可以與 using 關鍵字一起使用。

舉例來說:

1
2
3
4
5
6
7
8
9
10
11
{
const getResource = () => {
return {
[Symbol.dispose]: () => {
console.log('Hooray!')
}
}
}

using resource = getResource();
} // 'Hooray!' logged to console

當程式離開 resource 所在的 scope 後,就會觸發 Symbol.dispose 的 function

應用

比較常見的場景在於存取 DB、File System 等…
我們現在的作法需要用 try...finally 進行處理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
export function processFile(path: string) {
const file = fs.openSync(path, "w+");

try {
// use file...

if (someCondition()) {
// do some more work...
return;
}
}
finally {
// Close the file and delete it.
fs.closeSync(file);
fs.unlinkSync(path);
}
}

而改用 using 後可以變得如此簡單

1
2
3
4
5
6
7
8
9
10
export function processFile(path: string) {
using file = new TempFile(path);

// use file...

if (someCondition()) {
// do some more work...
return;
}
}

參考

(fin)

Please enable JavaScript to view the Gitalk. :D
Please enable JavaScript to view the LikeCoin. :P
Please enable JavaScript to view the LikeCoin. :P