2013-12-17 1 views
10

Я конвертирован некоторые классы от традиционной формы:Могу ли я использовать перегрузки TypeScript при использовании синтаксиса толстых стрелок для методов класса?

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

использовать функцию стрелки выражение вместо:

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

таким образом, чтобы избежать проблем при определении объема методы класса используется в функции обратного вызова (см. here для фона).

Я не могу решить, как воссоздать мои перегруженные сигнатуры функций. Как я могу написать свои перегрузки при использовании толстой стрелки?

+0

Do не используйте жирную стрелку для методов. Он станет свойством класса, а не прототипом. – garkin

ответ

15

Вы можете написать тип встроенного буквального для вызова подписи функции поддерживает:

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

Это своего рода отвратительным, так что вы можете извлечь его в интерфейс вместо:

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

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

Аннотации типа интерфейса - отличная идея. – Fenton

+0

Ницца, спасибо Райан! –

+0

Примечание: узнав об этом, я наткнулся на это TS Dos и Donts: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html Внизу странице в разделе «Использовать типы соединений», в нем упоминаются объединения для однопоточных перегрузок. Поэтому в этом примере это будет 'selector: JQuery | string): void' для определения. Мне интересно, должен ли фактический экземпляр быть союзом вместо 'any'? - '... = (selector: JQuery | string) => {alert ...' – ibgib

3

Это немного техничность, но вы больше не создаете функцию, вы создаете свойство (которое является функцией).

Вы могли бы решить свою проблему, используя вместо этого имя, а не перегрузку.

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

Если существует значительное дублирование, вы можете положить, что в общей функции, что обе названные функции называют, например: this.sharedStuff().

Смежные вопросы