TypeScript 5.2將引入一個新的關鍵字:using
。當它離開作用域時,你可以用Symbol.dispose
函數來處置任何東西。
{
const getResource = () => {
return {
[Symbol.dispose]: () => {
console.log('Hooray!')
}
}
}
using resource = getResource();
} // 'Hooray!' logged to console
這是基於TC39提議,該提議最近達到了第三階段,表明它即將進入JavaScript。
using
將對管理檔案控制程式碼、資料庫連線等資源非常有用。
Symbol.dispose
是JavaScript中一個新的全域性symbol
。任何具有分配給Symbol.dispose
函數的東西都將被視為"資源":也就是具有特定生命週期的物件。並且該資源可以使用using
關鍵字。
const resource = {
[Symbol.dispose]: () => {
console.log("Hooray!");
},
};
你也可以使用Symbol.asyncDispose
和await
來處理那些需要非同步處置的資源。
const getResource = () => ({
[Symbol.asyncDispose]: async () => {
await someAsyncFunc();
},
});
{
await using resource = getResource();
}
這將在繼續之前等待Symbol.asyncDispose
函數。
這對資料庫連線等資源來說很有用,你要確保在程式繼續前關閉連線。
通過節點中的檔案處理程式存取檔案系統,使用using
可能會容易得多。
不使用using
:
import { open } from "node:fs/promises";
let filehandle;
try {
filehandle = await open("thefile.txt", "r");
} finally {
await filehandle?.close();
}
使用using
:
import { open } from "node:fs/promises";
const getFileHandle = async (path: string) => {
const filehandle = await open(path, "r");
return {
filehandle,
[Symbol.asyncDispose]: async () => {
await filehandle.close();
},
};
};
{
await using file = getFileHandle("thefile.txt");
// Do stuff with file.filehandle
} // Automatically disposed!
管理資料庫連線是在C#中使用using
的一個常見用例。
不使用using
:
const connection = await getDb();
try {
// Do stuff with connection
} finally {
await connection.close();
}
使用using
:
const getConnection = async () => {
const connection = await getDb();
return {
connection,
[Symbol.asyncDispose]: async () => {
await connection.close();
},
};
};
{
await using { connection } = getConnection();
// Do stuff with connection
} // Automatically closed!
下圖是上面範例的圖片版本:
本文簡要介紹了TypeScript5.2中引入的新關鍵字using
,它的出現可以很好的和Symbol.dispose
搭配使用。有了它我們便不需要在try…catch
語句中進行資料庫的關閉,這對管理檔案控制程式碼、資料庫連線等資源時非常有用。
以上就是本文的全部內容,如果對你有所啟發,歡迎點贊、收藏、轉發~