تایپ اسکریپت در نسخه ۵٫۲ یک کلمه کلیدی جدید به نام using را معرفی می‌کند که می‌توانیم از آن برای dispose هر چیزی با تابع Symbol.dispose هنگامی که از scope خارج می‌شود، استفاده کنیم.

{
  const getResource = () => {
    return {
      [Symbol.dispose]: () => {
        console.log('Hooray!')
      }
    }
  }
  using resource = getResource();
} // 'Hooray!' logged to console

این مفهوم بر اساس پیشنهاد TC39 است، که اخیراً در پیشرفت خود به جاوااسکریپت به مرحله ۳ (از ۴) رسیده است.

استفاده از using برای مدیریت منابعی مانند file handleها، اتصالات پایگاه داده و موارد دیگر بسیار مفید خواهد بود.

Symbol.dispose

Symbol.disposeیک نماد سراسری جدید در جاوااسکریپت است. هر چیزی که با یک تابع به Symbol.disposeاختصاص داده شود یک resource، یعنی آبجکتی با طول عمر مشخص در نظر گرفته می‌شود و می‌تواند با کلمه کلیدی using مورد استفاده قرار بگیرد.

const resource = {
  [Symbol.dispose]: () => {
    console.log("Hooray!");
  },
};

await using

همچنین می‌توانیم از Symbol.asyncDisposeو await using برای مدیریت منابعی که باید به‌صورت غیرهمزمان (Asynchronous) dispose شوند در تایپ اسکریپت استفاده کنیم.

const getResource = () => ({
  [Symbol.asyncDispose]: async () => {
    await someAsyncFunc();
  },
});
{
  await using resource = getResource();
}

در مثال بالا قبل از این که کدها اجرا شوند، منتظر تابع Symbol.asyncDispose خواهند بود.

این مفهوم برای منابعی مانند اتصالات پایگاه داده مفید خواهد بود، زیرا این قسمت همان جایی است که می‌خواهیم اطمینان حاصل کنیم که اتصال قبل از ادامه برنامه بسته شده است.

موارد استفاده از کلمه کلیدی using

File handleها

استفاده از using می‌تواند دسترسی به فایل سیستم(fs) از طریق handlerهای فایل در node را بسیار آسان‌تر کند.

بدون استفاده از کلمه کلیدی 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 = getFileHandle("thefile.txt");
  // Do stuff with file.filehandle
} // Automatically disposed!

اتصالات پایگاه داده

مدیریت اتصالات پایگاه داده یکی از موارد رایج برای استفاده از using در سی‌شارپ است.

بدون استفاده از کلمه کلیدی using:

const connection = await getDb();
try {
  // Do stuff with connection
} finally {
  await connection.close();
}

با استفاده از کلمه کلیدی using:

const getConnection = async () => {
  const connection = await getDb();
  return {
    connection,
    [Symbol.asyncDispose]: async () => {
      await connection.close();
    },
  };
};
{
  await using db = getConnection();
  // Do stuff with db.connection
} // Automatically closed!

جمع‌بندی

در این مقاله سعی کردیم تا کلمه کلیدی using که در نسخه ۵٫۲ تایپ اسکریپت معرفی شده است را باهم بررسی کنیم و با کاربردهای آن آشنا شویم.