打字稿中是否有析构函数

Is there destructor in typeScript

TypeScript 有析构函数吗?如果没有,我怎样才能删除一个对象? 我尝试了 destructor()~ClassName() 但没有成功。

JavaScript 使用垃圾回收在对象不再被引用时自动删除它们。没有析构函数或终结器的概念。

您无法观察到对象何时被垃圾收集器删除,也无法预测。

你其实可以

    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()}
    }


    

从 ES2021 开始,终结器已添加到规范中。

要使用该功能,您需要创建一个 FinalizationRegistry,它会在任何关联对象被垃圾回收时通知您。

你可以这样使用它:

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);
}

注意当回调被调用时,对象已经被垃圾回收了;只有它的“遗嘱”(或者如 MDN 所说,不那么引人注目,“持有的价值”)被提供给终结器。

如果您需要访问终结器中对象的某些属性,您可以将它们存储在遗嘱中,在这种情况下,遗嘱可以(尽管不一定会)在原始对象之后被垃圾回收:

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);
}

请注意,规范不保证垃圾回收何时发生,因此如果对象留在内存中,甚至可能不会调用终结器。