2016-06-09 12 views
3

Ich bin ziemlich neu in TypeScript (1.8) und ich habe ein kleines Problem mit Vererbung und statischen Eigenschaften.TypeScript: statische Eigenschaften und Vererbung

Nachstehend finden Sie den Testcode ich zur Zeit läuft:

class A { 
    public static Items = { 
     FOO: 'A' 
    }; 

    public show() { 
     alert(this.constructor.Items.FOO); 
    } 
} 

class B extends A { 
    public static Items = { 
     FOO: 'B' 
    }; 
} 

var a = new A(); 
var b = new B(); 

a.show(); // alert "A" 
b.show(); // alert "B" 

TypeScript Playground link

Dieser Code läuft gut und die beiden Warnungen werden wie erwartet gezeigt.

ABER Typoskript Compiler wirft einen Fehler: Property "Items" does not exist on type "Function"

verstehe ich die Warnung und es ist völlig richtig von einer Typoskript Sicht, aber wie kann ich das gleiche Ergebnis erzielen, während die Compiler glücklich zu machen? this.Items.FOO funktioniert offensichtlich nicht und ich fand keine self Äquivalent oder so ähnlich ...

Fehle ich etwas?

Vielen Dank im Voraus!

+1

Beachten Sie, dass Ihre 'show' Methode funktioniert nicht, wenn Sie eine zusätzliche Unterklasse einzuführen, die * nicht * haben ein statisches' Elemente ' Eigentum, z 'class C erweitert A {}' –

Antwort

4

Es gab eine ähnliche Frage heute: Referencing class without name to use different static method in subclasses in TypeScript.

Es gibt eine Diskussion/Vorschlag this.constructor den richtigen Typ hier zurückgeben: T.constructor should be of type T.

Was mögliche Lösungen für Sie jetzt:

Ohne statisch überhaupt:

class A { 
    public show() { 
     alert(this.getItems().FOO); 
    } 

    protected getItems() { 
     return { 
      FOO: 'A' 
     } 
    }; 
} 

class B extends A { 
    protected getItems() { 
     return { 
      FOO: 'B' 
     } 
    } 
} 

(code in playground)

Static mit typeof:

class A { 
    public static Items = { 
     FOO: 'A' 
    }; 

    public show() { 
     alert((<typeof A | typeof B> this.constructor).Items.FOO); 
    } 
} 

(code in playground)

Static mit Konstruktor Schnittstelle:

interface AConstructor { 
    new(): A; 
    Items: any; 
} 

class A { 
    public static Items = { 
     FOO: 'A' 
    }; 

    public show() { 
     alert((this.constructor as AConstructor).Items.FOO); 
    } 
} 

(code in playground)

+0

'alert (( this.constructor) .Items.FOO);' für Ihren Typ von Lösung, andernfalls 'B.Items -> B.ItemsRenamed' nicht gefangen werden. –

+0

@mk. Danke, ich habe meine Antwort aktualisiert, obwohl ich denke, dass diese Lösung nicht sehr nützlich ist, wenn Sie mehr als zwei Klassen haben. Die erste Option (ohne die statische) ist meiner Meinung nach besser. –

4

verstehe ich die Warnung und es ist völlig richtig von einer Typoskript Sicht

Recht - das ist etwas wie Vererbung ist, aber es funktioniert nicht und soll für Ihre statischen Eigenschaften im Allgemeinen nicht funktionieren. Um dies zu umgehen, deaktivieren Sie Typprüfung mit any:

alert((<any>this.constructor).Items.FOO); 

Diese Situation tritt häufig auf, wenn alte js Code konvertieren, sollte aber vermieden werden, wenn neue Code TS zu schreiben. Wenn Sie dies richtig machen möchten, müssen Sie (wie Sie wahrscheinlich wissen) eine getItems oder eine ähnliche Methode in Ihren beiden Klassen implementieren und überschreiben, um die entsprechende Items zurückzugeben, und diese Methode von show aufrufen.

Verwandte Themen