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