2016-11-28 6 views
2

Ich arbeite an einem ionischen 2-Projekt mit Typescript 2.0.6.Typescript statische Methoden Vererbung

Ich habe eine Basisklasse, die einige Verhaltensweisen verwalten, und ich erben mehrere Klassen aus dieser Basisklasse. Und ich möchte in der Lage sein, den Namen der tatsächlichen Klasse (nicht die Basisklasse) zu bekommen.

Hier ist mein Code:

export class AbstractModel { 
    oneInstanceMethod() { 
     this.getClassName(); 
    } 
    static oneStaticMethod() { 
     this.getClassName(); 
    } 
    getClassName() { 
     return (<any>this).constructor.name; 
    } 
    static getClassName() { 
     return (<any>this).name; 
    } 
} 

export class MyClass1 extends AbstractModel { 

} 
export class MyClass2 extends AbstractModel { 

} 

Und ich habe zwei Arten von Anrufen: Entweder MyClass1.oneStaticMethod() oder (new MyClass2).oneInstanceMethod().

Mein Problem ist, dass dieser Code vorher funktioniert hat (jetzt bekomme ich 'e', ​​weil es die Funktion e() zurückgibt) Ich habe ein Upgrade in meinem ionischen Projekt gemacht. Ich denke, meine Typoskript-Version wurde aktualisiert (ich bin mir nicht sicher, aber ich denke, es war der 1.8 zuvor).

Wie kann ich das lösen? Ich habe viele Dinge ausprobiert (wie das Erstellen von Variablen, um die Werte zu speichern, aber beide funktionieren nicht im statischen Modus und im Instanzmodus).

Danke!

+0

Klingt, dass Ihr Code minimiert wird. Der Code, den Sie gepostet haben, scheint zu funktionieren (https://jsfiddle.net/7bp44voz/)? – Jeroen

+0

Sie können die Minifikationsklasse normalerweise so anpassen, dass Klassen- und Funktionsnamen beibehalten werden, obwohl Sie möglicherweise Ihr Design überdenken müssen (d. H. * Warum * benötigen Sie einen Klassennamen?) Oder ist es zum Debuggen?) – Jeroen

+0

nein, ich schreibe ein ORM und ich möchte viele Dinge in der Basisklasse abstrahieren. Und ich möchte den Klassennamen als meinen SQL-Tabellennamen verwenden. –

Antwort

1

Wenn ich Ihren Code ad kopieren wörtlich und fügen:

var a = new MyClass1(); 
var b = new MyClass2(); 

document.body.innerHTML = a.getClassName() + " - " + b.getClassName(); 

Dann it runs as you expect.

Das Problem, das bei Ihnen auftritt, ist wahrscheinlich auf eine Minimierung zurückzuführen. Ihre Klassennamen werden in der Minification entstellt. Die meisten Minifier haben eine Option, die Umbenennung von Klassen/Funktionen zu deaktivieren. Sie haben nicht erwähnt, welche Sie verwenden, aber ihre Dokumentation sagt etwas darüber aus. Es wird jedoch die Dateigröße erhöhen.

Sie haben ein wenig in den Kommentaren geklärt, und ich würde immer noch empfehlen, keine Klassennamen zu verwenden, sondern es vorziehen, über diese Art von Dingen explizit zu sein. Mit Typoskript Sie Verstärkung Tooling-Unterstützung für automatisierte Umbenennen, aber Sie werfen das irgendwie weg. Andererseits ist das Ihre eigene Designentscheidung.


Fußnote: Hier ist eine Lösung, die nützlich sein kann oder nicht, je nach Ihren Designvorlieben. Es löst das Wissen über zugeordnete Tabellennamen in eine Instanzvariable:

class AbstractModel { 
    _tableName: string = null; 

    getClassName =() => { 
    if (!this._tableName) { 
     throw new Error("No table name was set for this DTO."); 
    } 
    return this._tableName; 
    } 
} 

class MyClass1 extends AbstractModel { 
    _tableName = "MyTable1"; 
} 

class MyClass2 extends AbstractModel { 
    _tableName = "AnotherTable2"; 
} 

var a = new MyClass1(); 
var b = new MyClass2(); 

document.body.innerHTML = a.getClassName() + " - " + b.getClassName(); 

anzeigen in action on jsfiddle.

Bitte beachte, dass ich auch in dieser schlich:

getClassName =() => { 

vs

getClassName() { 

Damit this korrekt erfasst wird und bezieht sich auf die Klasseninstanz, nicht die Funktion, die Ausführung ist.

+0

danke! Ich versuche, den Minifier zu finden, aber ich verstehe, dass es besser ist, explizit zu sein, aber ich kann keine geerbten statischen Methoden oder Eigenschaften von der Basisklasse verwenden. Es ruft immer die Basisklassenmethode oder -eigenschaft auf, sodass ich meine Variablen nicht wirklich überschreiben kann. Zu diesem Zeitpunkt war die Verwendung des Klassennamens die einzige funktionierende Lösung :( –

+0

Ich habe einen möglichen Weg hinzugefügt, um dieses Problem zu lösen, siehe die Fußnote. (Hüten Sie sich davor, dass 'this' in Member-Methoden richtig funktioniert Praktisch, um sie als Lambdas zu erstellen, nicht als normale 'Funktion'. – Jeroen

+0

Danke! Lassen Sie mich versuchen, weil ich immer mit statischen Methoden pb –