Привет! Представляю вашему вниманию перевод статьи Matt Pocock.
Источник
TypeScript 5.2 представит новое ключевое слово - using, которое можно использовать, чтобы избавиться от чего угодно с помощью функции Symbol.dispose, при покидании области видимости.
{ const getResource = () => { return { [Symbol.dispose]: () => { console.log('Hooray!') } } } using resource = getResource(); } // 'Hooray!' logged to console
Обосновано это предложениями TC39, достигшими недавно Фазы 3, что демонстрирует скорое появление в JavaScript.
using будет очень полезным для управления ресурсами, такими как ссылки на файлы, соединения с базами данных и т.п.
Symbol.dispose
Symbol.dispose - новый глобальный символ в JavaScript. Всё что угодно с функцией, присвоеннойSymbol.dispose будет рассматриваться как 'ресурс' - "объект с особым жизненным циклом" - и может быть использовано со словом using.
const resource = { [Symbol.dispose]: () => { console.log("Hooray!"); }, };
await using
Вы также можете использовать Symbol.asyncDispose и await using чтобы управлять ресурсами, которые должны быть распределены асинхронно.
const getResource = () => ({ [Symbol.asyncDispose]: async () => { await someAsyncFunc(); }, }); { await using resource = getResource(); }
Будет ожидать функцию Symbol.asyncDispose для продолжения.
Это будет полезно для ресурсов типа коннекторов БД, когда необходимо убедиться, что соединение закрыто, прежде чем продолжать.
Случаи использования
Указатели на файлы
Доступ к файловой системе с помощью хэндлеров на ноде может быть намного проще с using.
До:
import { open } from "node:fs/promises"; let filehandle; try { filehandle = await open("thefile.txt", "r"); } finally { await filehandle?.close(); }
После:
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!
Соединения с БД
До:
const connection = await getDb(); try { // Do stuff with connection } finally { await connection.close(); }
После:
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!
Спасибо за внимание! Больше интересного по фронтенду - тут.
