Есть ли способ добавить методы "на лету" к классу с помощью typescript?
Я пытаюсь создать какой-то метод mixin, который на лету добавляет методы прототипу/классу, но я получаю такие ошибки, как
Свойство 'greetName' не существует при значении типа 'Greeter' любой
и
Свойство 'greetName' не существует при значении типа 'Greeter' любой
когда я запускаю следующий код.
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Greeter.prototype.greetName = function(name){
return this.greet() + ' ' + name;
}
var greeter = new Greeter('Mr');
window.alert(greeter.greetName('Name'));
Он фактически компилируется в действительные js и запускается, как ожидалось. Есть ли способ сделать это без предупреждений/ошибок компилятора?
Ответы
Ответ 1
Это решение дает вам возможность проверять тип при динамическом добавлении метода:
class MyClass {
start() {
}
}
var example = new MyClass();
//example.stop(); not allowed
interface IMyInterface {
start(): void;
stop(): void;
}
MyClass.prototype['stop'] = function () {
alert('Stop');
}
var stage2 = <IMyInterface> <any> example; // A bit gnarly
stage2.stop();
Ответ 2
Есть и другой способ сделать это.
Greeter["SomeProperty"] = function() {
return "somevalue";
};
Работает то же самое и использует функцию индексатора свойств в javascript и typescript не жалуется.
Ответ 3
Им понадобится концепция частичных классов для работы, которая в настоящее время не поддерживается. Я скажу вам, что то, что я нашел, работает лучше для этих типов сценариев - вместо этого использовать интерфейсы (я программировал в TypeScript в течение примерно 6 месяцев - я нахожусь на MS, но не на TypeScript команда)
Интерфейсы расширяются после факта, просто отбрасывая методы, которые вы добавляете в интерфейс. В качестве примера этого, если вы устанавливаете плагин jQuery, вам нужно переопределить интерфейс IJQuery и IJQueryUtil, чтобы включить дополнительные методы плагинов. С этого момента вы можете вызвать методы плагинов через $.plugin() и TypeScript, будут счастливы.
Ответ 4
После выполнения динамических методов и свойств в классах это было решением, с которым я смог пойти, чтобы предотвратить компилятор Typescript:
...
window.alert(greeter['greetName']('Name'));
В принципе, используйте метод привязки атрибутов свойств.