我可能没有问正确的问题...但是我的班级关系如下:

export class ParentClass {
  someProperty: string;

  constructor(){}

  duplicate() {
    const dup = new this; // doesn't work for obvious reasons
    return dup;
  }
}

export class ChildClass extends ParentClass{
  constructor(){
    super();
  }
}


因为最终我希望这两种情况都能正常工作,并且希望它们成为最初的类型:

const shouldBeParent: ParentClass = new ParentClass().duplicate();
const shouldBeChild: ChildClass = new ChildClass().duplicate();


有没有一种方法可以推断出有关对象本身的构造函数并从中创建一个新实例?

最佳答案

您可以通过以下方式进行操作:

class ParentClass {
  str = 'parent'
  constructor(){}

  duplicate() {
     // return new (<any>this.constructor); as more generic way
     return new (<typeof ParentClass>this.constructor);
  }
}

class ChildClass extends ParentClass{
  str = 'child'
  constructor(){
    super();
  }
}

const shouldBeParent: ParentClass = new ParentClass().duplicate();
const shouldBeChild: ChildClass = new ChildClass().duplicate();

console.log(shouldBeParent.str) // parent
console.log(shouldBeChild.str) // child

关于javascript - 如何从父方法创建子类型的新对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58210864/

10-11 05:09