TypeScript 5.2: Нове ключове слово: ‘using’
У TypeScript 5.2 з’явиться нове ключове слово ‘using’, яке можна буде використовувати для утилізації чогось за допомогою функції Symbol.dispose
, коли воно залишає область видимості.
{
const getResource = () => {
return {
[Symbol.dispose]: () => {
console.log('Hooray!')
}
}
}
using resource = getResource();
} // 'Hooray!
Він заснований на пропозиції TC39, яка нещодавно досягла третьої стадії (з чотирьох) у своєму просуванні до JavaScript. Це означає, що воно готове для тестування ранніми користувачами.
using
буде надзвичайно корисним для управління такими ресурсами, як обробник файлів, з’єднання з базами даних і т.д.
Symbol.dispose
Symbol.dispose – це новий глобальний символ JavaScript. Все, що має функцію, призначену Symbol.dispose
, буде вважатися “ресурсом” – ” об’єктом з певним часом життя ” – і може бути використане з ключовим словом using
.
const resource = {
[Symbol.dispose]: () => {
console.log("Hooray!");
},
};
await using
Для роботи з ресурсами, які необхідно утилізувати асинхронно, також можна використовувати Symbol.asyncDispose
і await
.
const getResource = () => ({
[Symbol.asyncDispose]: async () => {
await someAsyncFunc();
},
});
{
await using resource = getResource();
}
В результаті перед продовженням програми очікується функція Symbol.asyncDispose
.
Це буде корисним для таких ресурсів, як з’єднання з базами даних, коли необхідно переконатися, що з’єднання закрито до продовження роботи програми.
Приклади використання
Керування файлами
Доступ до файлової системи через файлові обробники в node може бути значно простіше 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 = await getFileHandle("thefile.txt");
// щось робим з file.filehandle
} // автоматично утілізован!
З’єднання з базою даних
Управління з’єднаннями з базами даних – один із найпоширеніших варіантів використання в C#.
Без using
:
const connection = await getDb();
try {
// щось робим з connections
} finally {
await connection.close();
}
З використанням using
:
const getConnection = async () => {
const connection = await getDb();
return {
connection,
[Symbol.asyncDispose]: async () => {
await connection.close();
},
};
};
{
await using db = await getConnection();
// щось робим з db.connection
} // автоматично закрито!
Переклад статті TypeScript 5.2’s New Keyword: ‘using’