有没有一种方法可以使用变量来实例化带有参数列表中可选参数的类?

时间:2019-04-06 19:40:47

标签: typescript

我希望根据变量的值来实例化各种类。

如该Stackblitz https://angular-nsdbu3.stackblitz.io所示,如果构造函数中没有参数,则可以正常工作,但是在构造函数中具有参数时,它将失败。

我做错什么了吗,或者如果构造函数中有参数,没有办法做我想要的目标吗?

// WITH PARAMETERS

export class Foo {
prop1: string;

  constructor(prop1: string="foo!") {
    console.log("Foo constructor: "+prop1);
  }
}

// WITHOUT PARAMETERS

export class Bar {
prop1: string;

   constructor() {
     this.prop1 = "bar!";
     console.log("Bar constructor:"+this.prop1)
   }

}

测试台:

export class HelloComponent  {
  @Input() name: string;
  objClasses = {
    foo: Foo,
    bar: Bar
  }
  ngOnInit() {
    let thisTypeOne = this.objClasses.foo;
    let myFooObj = new (thisTypeOne)();
    let anotherFooObj = new (thisTypeOne)("bazz"); 
    console.log("My Foo Obj: " + myFooObj.prop1);           // *** Undefined
    console.log("Another Foo Obj: " + anotherFooObj.prop1); // *** Undefined

    let thisTypeTwo = this.objClasses["bar"];
    let myBarObj = new (thisTypeTwo)();
    console.log("My Bar Obj: "+myBarObj.prop1);             // *** bar!

2 个答案:

答案 0 :(得分:0)

您可以使用Object.create(proto, [propertiesObject]),将类名传递给此函数,它将返回对象。但是属性部分应定义为对象,因此您不能将参数直接传递给构造函数。所以在您的代码中尝试一下;

let anotherFooObj = Object.create(thisTypeOne, {prop1:{value:"buzz"}});

答案 1 :(得分:-1)

您忘记在构造函数中设置实例属性-TypeScript不会自动进行设置。

export class Foo {
  prop1: string;

  constructor(prop1: string="foo!") {
    console.log("Foo constructor: "+prop1);
    this.prop1 = prop1;
  }
}