تایپ اسکریپت در نسخه ۵٫۲ یک کلمه کلیدی جدید به نام 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
اختصاص داده شود یک resource، یعنی آبجکتی با طول عمر مشخص در نظر گرفته میشود و میتواند با کلمه کلیدی using مورد استفاده قرار بگیرد.
const resource = { [Symbol.dispose]: () => { console.log("Hooray!"); }, };
همچنین میتوانیم از Symbol.asyncDispose
و await using برای مدیریت منابعی که باید بهصورت غیرهمزمان (Asynchronous) dispose شوند در تایپ اسکریپت استفاده کنیم.
const getResource = () => ({ [Symbol.asyncDispose]: async () => { await someAsyncFunc(); }, }); { await using resource = getResource(); }
در مثال بالا قبل از این که کدها اجرا شوند، منتظر تابع Symbol.asyncDispose
خواهند بود.
این مفهوم برای منابعی مانند اتصالات پایگاه داده مفید خواهد بود، زیرا این قسمت همان جایی است که میخواهیم اطمینان حاصل کنیم که اتصال قبل از ادامه برنامه بسته شده است.
استفاده از 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 که در نسخه ۵٫۲ تایپ اسکریپت معرفی شده است را باهم بررسی کنیم و با کاربردهای آن آشنا شویم.