În dezvoltarea de aplicații de backend sau sisteme complexe, gestionarea resurselor (mânere de fișiere, conexiuni la baze de date, lock-uri de memorie, socket-uri de rețea) impunea folosirea blocurilor verbos de try ... finally pentru a garanta că resursa este închisă corect chiar dacă apare o excepție. Începând cu TypeScript 5.2, a fost adoptat standardul ECMAScript Explicit Resource Management prin cuvintele cheie using și await using.
// METODA VECHE: Risc ridicat de scurgeri de memorie dacă se uită finally
function proceseazaDateVechi() {
const lock = acquireMutex();
try {
// ... operațiuni critice ...
} finally {
lock.release(); // Obligatoriu manual!
}
}
// METODA NOUĂ ÎN TYPESCRIPT 5.2+:
// Un obiect este "Disposable" dacă implementează metoda [Symbol.dispose]():
class MutexLock {
constructor() { console.log("Mutex blocat!"); }
[Symbol.dispose]() {
console.log("Mutex deblocat automat la ieșirea din scope!");
}
}
function proceseazaDateModern() {
using lock = new MutexLock();
// ... operațiuni critice ...
if (Math.random() > 0.5) {
throw new Error("Eroare neașteptată!"); // Chiar dacă aruncăm eroare, lock-ul se eliberează garantat!
}
} // La atingerea acestei acolade, [Symbol.dispose]() este apelat AUTOMAT!
Resurse Asincrone cu await using și Symbol.asyncDispose
Pentru resurse a căror închidere necesită o operațiune asincronă de I/O (cum ar fi returnarea unei conexiuni într-un pool de baze de date PostgreSQL sau închiderea unui stream de rețea), se folosește await using:
interface ConexiuneBd {
interogheaza(sql: string): Promise<any>;
[Symbol.asyncDispose](): Promise<void>;
}
async function obtineClientDinPool(): Promise<ConexiuneBd> {
const conn = await pool.connect();
return {
interogheaza: (sql) => conn.query(sql),
[Symbol.asyncDispose]: async () => {
await conn.release(); // Returnează clientul în pool
console.log("Conexiune returnată cu succes în pool!");
}
};
}
async function exportaRaport() {
// Conexiunea este închisă automat la finalul funcției sau la eroare:
await using db = await obtineClientDinPool();
const date = await db.interogheaza("SELECT * FROM comenzi");
console.log(`Procesat ${date.length} comenzi.`);
}
Configurarea tsconfig.json pentru using
Pentru a utiliza această funcționalitate în TypeScript 5.2+, asigurați-vă că aveți configurat în tsconfig.json suportul pentru biblioteca standard corespunzătoare:
{
"compilerOptions": {
"target": "es2022",
"lib": ["es2022", "esnext.disposable", "dom"]
}
}