¿Hay destructor en TypeScript? Si no, ¿cómo puedo eliminar un objeto? Probé destructor() y ~ClassName() pero no funcionó.
JavaScript utiliza la recolección de elementos no utilizados para eliminar automáticamente los objetos cuando ya no se hace referencia a ellos. No existe el concepto de destructores o finalizadores.
No puede observar cuándo el recolector de basura elimina un objeto, ni es predecible.
A partir de ES2021, se agregaron finalizadores a la especificación.
Para usar esa función, crea un FinalizationRegistry , que le notifica cuando cualquiera de los objetos asociados se recolecta como basura.
Puedes usarlo así:
const reg = new FinalizationRegistry((id: number) => { console.log(`Test #${id} has been garbage collected`); }); class Test{ id: number; constructor(id: number){ this.id = id; reg.register(this, this.id); // ^^^^^^^--- This is the "testament", whatever value, which will be passed to the finalization callback } } { const test1 = new Test(1); const test2 = new Test(2); }Tenga en cuenta que cuando se llama a la devolución de llamada, el objeto ya había sido recolectado como basura; solo su "testamento" (o como dice MDN, de manera menos dramática, el "valor retenido") se le da al finalizador.
Si necesita acceder a algunas propiedades del objeto en el finalizador, puede almacenarlas dentro del testamento, que, en este caso, puede recolectarse como basura justo después del objeto original:
interface TestTestament{ id: number, intervalid: ReturnType<typeof setInterval> } const reg = new FinalizationRegistry((testament: TestTestament) => { console.log(`Test #${testament.id} has been garbage collected`); clearInterval(testament.intervalid); }); class Test{ private testament: TestTestament; constructor(id: number){ this.testament = { id, intervalid: setInterval(() => { console.log(`Test interval #${id}`); }, 1000) }; reg.register(this, this.testament); } } { const test1 = new Test(1); const test2 = new Test(2); }Tenga en cuenta que la especificación no garantiza cuándo ocurre la recolección de basura, por lo que es posible que ni siquiera se llame al finalizador si el objeto permanece en la memoria.
en realidad puedes
class MyClass { constructor(input1, input2){ this.in1 = input1; this.in2 = input2; } } let myObject = {}; try { myObject = { classHandler: new MyClass('1','2') } } catch (e) { } finally { delete myObject.classHandler // garbageCollect if (global.gc) {global.gc()} }