2013-12-17 7 views
10

Ich habe einige Klassen von der herkömmlichen Form umgewandelt:Kann ich TypeScript-Überladungen verwenden, wenn ich die Fettpfeilsyntax für Klassenmethoden verwende?

class TestOverloads { 
    private status = "blah"; 
    public doStuff(selector: JQuery); 
    public doStuff(selector: string); 
    public doStuff(selector: any) { 
     alert(this.status); 
    } 
} 

statt Pfeil Funktion Ausdrücke zu verwenden:

class TestOverloads2 { 
    private status = "blah"; 
    public doStuff = (selector: any) => { 
     alert(this.status); 
    } 
} 

um Scoping Probleme zu vermeiden, wenn die Klassenmethoden in einem Callback verwendet werden (für Hintergrund siehe here.

Ich kann jedoch nicht herausfinden, wie ich meine überladenen Funktionssignaturen neu erstellen kann. Wie würde ich meine Überladungen schreiben, wenn ich den Fettpfeil verwende?

+0

Do Verwenden Sie keinen Fettpfeil für Methoden. Es wird eine Eigenschaft der Klasse, keine Prototyp-Methode. – garkin

Antwort

15

Sie können eine Inline-wörtliche für den Aufruf der Funktion Signaturen schreiben unterstützt:

class TestOverloads2 { 
    private status = "blah"; 
    public doStuff: { 
     (selector: JQuery): void; 
     (selector: string): void; 
    } = (selector: any) => { 
     alert(this.status); 
    } 
} 

diese Art von abscheulichen ist, so dass Sie es in eine Schnittstelle statt extrahieren möchten vielleicht:

interface SelectByJQueryOrString { 
    (selector: JQuery): void; 
    (selector: string): void; 
} 

class TestOverloads3 { 
    private status = "blah"; 
    public doStuff: SelectByJQueryOrString = (selector: any) => { 
     alert(this.status); 
    } 
} 
+0

Die Annotation vom Schnittstellentyp ist eine großartige Idee. – Fenton

+0

Schön, danke Ryan! –

+0

Hinweis: Als ich davon erfuhr, stieß ich auf diese TS Dos und Donts: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html Am unteren Rand von Auf der Seite im Abschnitt Union-Typen verwenden wird die Verwendung von Unions für Überladungen in einer Position erwähnt. In diesem Beispiel wäre also 'selector: JQuery | string): void' für die Definition. Ich frage mich, ob die tatsächliche Instanz auch eine Gewerkschaft anstelle von "irgendjemand" sein sollte? - '... = (selector: JQuery | string) => {alert ...' – ibgib

3

Es ist ein bisschen technischer Natur, aber Sie erstellen keine Funktion mehr, Sie erstellen eine Eigenschaft (die zufällig eine Funktion ist).

Sie könnten Ihr Problem lösen, indem Sie Benennung anstatt überladen.

class TestOverloads2 { 
    private status = "blah"; 
    public doStuffWithSelector = (selector: string) => { 
     alert(this.status); 
    } 
    public doStuffWithJqueryObject = (jqo: JQuery) => { 
     alert(this.status); 
    } 
} 

Wenn es erhebliche Überschneidungen gibt, können Sie, dass in einer gemeinsamen Funktion setzen, die beide genannten Funktionen aufrufen, zum Beispiel: this.sharedStuff().