2013-12-17 12 views
10

Mam przeliczone niektórych klas od konwencjonalnej postaci:Czy mogę używać przeciążenia TypeScript przy użyciu składni strzałki grubej dla metod klasowych?

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

używać wyrażeń funkcyjnych strzałka Zamiast:

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

tak aby uniknąć określania zakresu problemów, gdy metody klasy są wykorzystywane w zwrotnego (patrz here dla tła).

Nie mogę się jednak dowiedzieć, jak odtworzyć swoje przeciążone sygnatury funkcji. Jak napisać moje przeciążenia podczas używania grubej strzałki?

+0

Do nie używaj tłustej strzałki dla metod. Stanie się własnością klasy, a nie prototypową. – garkin

Odpowiedz

15

Można napisać typu inline dosłownego na wezwanie podpisy funkcję obsługuje:

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

To swego rodzaju ohydne, więc warto, aby wyodrębnić go do interfejsu Zamiast:

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

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

Adnotacja typu interfejsu to świetny pomysł. – Fenton

+0

Dobrze, dzięki Ryan! –

+0

Uwaga: Dowiedzieć się o tym, natknąłem się na TS Dos i Donts: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html Na dole strona w sekcji Użyj typów unijnych, wspomina o wykorzystaniu związków dla przeciążeń jednopozycyjnych. W tym przykładzie będzie to selektor: JQuery | string): void' dla definicji. Zastanawiam się, czy faktyczna instancja powinna być również połączeniem zamiast "jakiegokolwiek"? - '... = (selector: JQuery | string) => {alert ...' – ibgib

3

To trochę techniczna, ale nie tworzysz już funkcji, tworzysz własność (która jest funkcją).

Możesz rozwiązać problem, używając nazywania zamiast przeładowywania.

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

Jeżeli istnieje znaczne powielanie, który można umieścić we wspólnej funkcji że obie wymienione funkcje połączeń, na przykład: this.sharedStuff().

Powiązane problemy