Как создать экземпляр класса с помощью переменной - PullRequest
0 голосов
/ 02 апреля 2019

В TypeScript я видел в других обсуждениях, что должен быть способ создать класс, тип которого зависит от переменной.

Например, если у нас есть.,,

class MyClass {    
   someFunc(){alert("Hello");}    
}
var myClassName = "MyClass";

Ответы предположительно были следующими:

Ответ №1:
var myClassInstance = new (<any>window)[myClassName]();

Ответ №2:
var myClassInstance = Object.create(window[myClassName]);

Я пытаюсь это сделать в своей консоли, но ни одна из них не работает для меня.
Для # 1 я получаю сообщения об ошибках: «Ошибка синтаксиса» или, если я пропускаю <any>, то «Объект не поддерживает это»action ".
Для # 2 я получаю сообщения об ошибках:" Object.create: аргумент не является объектом и не является нулевым "

У кого-нибудь есть идеи, почему они не работают для меня,и / или как я могу создать экземпляр класса в Typescript на основе значения переменной, содержащей имя класса?Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Вы не можете сделать это с class - вам придется использовать конструктор ES5:

function MyClass() {}
MyClass.prototype.someFunc = function() {
  alert("Hello!");
};
var myClassName = "MyClass";
var myClassInstance = new window[myClassName]();
myClassInstance.someFunc();
1 голос
/ 02 апреля 2019

Причина, по которой эти "ответы" не работают, заключается в том, что MyClass не является свойством глобального объекта (в вашем случае это окно)

Это верно для переменных, объявленных в глобальной области видимости с помощью let и const, а также

Однако, поскольку вы, похоже, готовы перейти к определению старой школы, т.е. готовы переписать определения классов, вы всегда можете использовать это вместо этого - с бонусом, который естьтребуется минимальное переписывание

Примечание: используйте var не let или const

var MyClass = class MyClass {    
   someFunc(){alert("Hello");}
}
var AnotherClass = class AnotherClass {    
   someFunc(){alert("Hello again");}
}
var YetAnotherClass = class YetAnotherClass {    
   someFunc(){alert("Hello once more");}
}

Тогда вы можете просто

let instance = new window[myClassName]();

Кроме того, в зависимости от того, где/ Как классы определены (в импорте?), на самом деле может потребоваться сделать что-то вроде

window.MyClass = class MyClass {    
   someFunc(){alert("Hello");}
}

вместо

...