TypeScript 5.2: Новое ключевое слово: ‘using’

от автора

Эта статья — перевод оригинальной статьи «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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *