Эта статья — перевод оригинальной статьи «TypeScript 5.2’s New Keyword: ‘using’».
Также я веду телеграм канал “Frontend по-флотски”, где рассказываю про интересные вещи из мира разработки интерфейсов.

В 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 } // автоматически закрыто!
ссылка на оригинал статьи https://habr.com/ru/articles/750854/
Добавить комментарий