Есть ли способ использовать переменные для создания экземпляров классов с необязательными аргументами в списке параметров?

#typescript

#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!
  

Комментарии:

1. Похоже, что этот код потерял prop1 свойство ваших классов — Bar конструктор устанавливает его, но оно не определено. Пожалуйста, завершите пример, чтобы мы могли вам помочь.

2. Кроме того, не должно быть необходимости определять это, поскольку код все равно должен выполняться без явного объявления, но я добавил объявления любым способом в Stackblitz < angular-nsdbu3.stackblitz.io >. Все тот же результат. Кроме того, пожалуйста, не стесняйтесь разветвлять Stackblitz и вносить любые изменения, которые вы считаете подходящими, заранее большое спасибо за ваш отзыв и за то, что помогли мне понять это!

Ответ №1:

Вы можете использовать Object.create(proto, [propertiesObject]) , передать имя класса этой функции, и она вернет объект. Но часть свойств должна быть определена как объект, поэтому вы не можете передать параметры конструктору напрямую. Итак, в вашем коде попробуйте это;

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

Ответ №2:

Вы забыли установить свойство instance в конструкторе — TypeScript не делает этого автоматически.

 export class Foo {
  prop1: string;

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