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

TypeScript using

У 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
} // автоматично закрито!

Переклад статті TypeScript 5.2’s New Keyword: ‘using’