2013-12-17 5 views
10

ho convertito alcune classi dalla forma convenzionale:È possibile utilizzare overload di TypeScript quando si utilizza la sintassi della fat fat per i metodi di classe?

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

per usare le espressioni di funzione freccia invece:

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

in modo da evitare problemi quando scoping i metodi della classe vengono utilizzati in un callback (vedi here per lo sfondo).

Non riesco a capire come ricreare le mie firme di funzioni sovraccariche. Come scriverei i miei sovraccarichi quando uso la freccia grassa?

+0

Do non usare la fat fat per i metodi. Diventerà una proprietà della classe, non un metodo prototipo. – garkin

risposta

15

È possibile scrivere un tipo di linea letterale per la chiamata firme la funzione supporta:

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

Ecco sorta di orribile, così si potrebbe desiderare per estrarlo in un'interfaccia invece:

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

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

L'annotazione del tipo di interfaccia è una grande idea. – Fenton

+0

Bello, grazie Ryan! –

+0

Nota: nell'apprendere a questo proposito, mi sono imbattuto in questo TS Dos and Donts: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html Nella parte inferiore di la pagina nella sezione Usa tipi di unione, menziona usando i sindacati per sovraccarichi a posizione singola. Quindi in questo esempio, sarebbe 'selector: JQuery | string): void' per la definizione. Mi sto chiedendo, anche se l'istanza attuale fosse un'unione anziché "qualsiasi"? - '... = (selettore: JQuery | string) => {alert ...' – ibgib

3

È un po 'un problema tecnico, ma non si crea più una funzione, si sta creando una proprietà (che sembra essere una funzione).

Si potrebbe risolvere il problema usando la denominazione anziché il sovraccarico.

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

Se c'è una significativa duplicazione, si può mettere che in una funzione comune che entrambe le funzioni denominate chiamata, ad esempio: this.sharedStuff().