Есть ли способ добавить методы "на лету" к классу с помощью 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'));

В принципе, используйте метод привязки атрибутов свойств.