Как стать автором
Обновить

Новое слово в TypeScript 5.2

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров13K
Автор оригинала: Matt Pocock

Привет! Представляю вашему вниманию перевод статьи 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!

Спасибо за внимание! Больше интересного по фронтенду - тут.

Теги:
Хабы:
Всего голосов 12: ↑11 и ↓1+11
Комментарии9

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань