Эта статья — перевод оригинальной статьи "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
} // автоматически закрыто!

Комментарии (3)


  1. mayorovp
    27.07.2023 13:53
    +2

    А чем ваш перевод лучше вот этого?


    1. Lomserman
      27.07.2023 13:53

      Картинкой для привлечения внимания и подсветкой синтаксиса в первых четырёх блоках :)


    1. qmzik Автор
      27.07.2023 13:53
      -1

      Косяк(