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