Finns det ett sätt att lägga till metoder på språng till en klass med TypeScript?


Jag försöker skapa någon slags mixin-metod som lägger till metoder till prototypen/klassen dynamiskt, men jag får fel såsom

Egenskapen 'greetName' finns inte på värdet av typ 'Greeter' any

och

Egenskapen 'greetName' finns inte på värdet av typ 'Greeter' any

när jag kör följande kod.

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'));

Det kompilerar faktiskt till giltig JS och körs som förväntat. Finns det ett sätt att göra detta utan kompilatorvarningar/fel?

Svar #1

Denna lösning har fördelen att ge dig typkontroll när du dynamiskt lägger till en metod:

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();

Svar #2

De skulle behöva ett koncept av partiella klasser för att detta ska fungera vilket för närvarande inte stöds. Jag kan säga att det jag har funnit fungerar bättre för dessa typer av scenarier är att använda gränssnitt istället (jag har programmerat i TypeScript i ungefär 6 månader nu - jag är på MS men inte i TypeScript-teamet)

Gränssnitt är utbyggbara i efterhand genom att helt enkelt definiera de metoder du lägger till i gränssnittet. Som ett exempel på detta, om du installerar ett jQuery-plugin, kommer du vilja definiera om IJQuery- och IJQueryUtil-gränssnittet för att inkludera pluginets ytterligare metoder. Från och med det ögonblicket kan du anropa pluginets metoder genom $.plugin() och TypeScript kommer att vara nöjd.

Relaterade artiklar