Могу ли я использовать перегрузки 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);
    }
}

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

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

Ответ 1

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

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);
    }
}

Ответ 2

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

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

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

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