Вопрос

Есть ли способ сделать метод перегрузки в текстосписок?

Я хочу достичь чего-то вроде этого:

class TestClass {
    someMethod(stringParameter: string): void {
        alert("Variant #1: stringParameter = " + stringParameter);
    }

    someMethod(numberParameter: number, stringParameter: string): void {
        alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);
    }
}

var testClass = new TestClass();
testClass.someMethod("string for v#1");
testClass.someMethod(12345, "string for v#2");
.

Вот пример того, что я не хочу делать (я действительно ненавижу эту часть перегрузки взлома в js):

class TestClass {
    private someMethod_Overload_string(stringParameter: string): void {
        // A lot of code could be here... I don't want to mix it with switch or if statement in general function
        alert("Variant #1: stringParameter = " + stringParameter);
    }

    private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {
        alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);
    }

    private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {
        alert("Variant #3: stringParameter = " + stringParameter + ", numberParameter = " + numberParameter);
    }

    public someMethod(stringParameter: string): void;
    public someMethod(numberParameter: number, stringParameter: string): void;
    public someMethod(stringParameter: string, numberParameter: number): void;

    public someMethod(): void {
        switch (arguments.length) {
        case 1:
            if(typeof arguments[0] == "string") {
                this.someMethod_Overload_string(arguments[0]);
                return;
            }
            return; // Unreachable area for this case, unnecessary return statement
        case 2:
            if ((typeof arguments[0] == "number") &&
                (typeof arguments[1] == "string")) {
                this.someMethod_Overload_number_string(arguments[0], arguments[1]);
            }
            else if ((typeof arguments[0] == "string") &&
                     (typeof arguments[1] == "number")) {
                this.someMethod_Overload_string_number(arguments[0], arguments[1]);
            }
            return; // Unreachable area for this case, unnecessary return statement
        }
    }
}


var testClass = new TestClass();
testClass.someMethod("string for v#1");
testClass.someMethod(12345, "string for v#2");
testClass.someMethod("string for v#3", 54321);
.

Это было полезно?

Решение

Согласно спецификации, TypeScript делает перегрузку метода метода поддержки, но это совсем неловко и включает в себя много ручной работы типов параметров.Я думаю, что в основном это в основном, потому что самая близкая вы можете добраться до перегрузки метода в простом JavaScript, включает в себя, что проверка тоже и TypectScript пытается не изменять фактические телы метода, чтобы избежать каких-либо ненужных целей производительности выполнения.

Если я правильно понимаю, вы должны сначала написать объявление метода для каждой из перегрузок, а затем один реализация метода, которая проверяет его аргументы для решения того, какая перегрузка была вызвана.Подпись реализации должна быть совместима со всеми перегрузками.

class TestClass {
    someMethod(stringParameter: string): void;
    someMethod(numberParameter: number, stringParameter: string): void;

    someMethod(stringOrNumberParameter: any, stringParameter?: string): void {
        if (stringOrNumberParameter && typeof stringOrNumberParameter == "number")
            alert("Variant #2: numberParameter = " + stringOrNumberParameter + ", stringParameter = " + stringParameter);
        else
            alert("Variant #1: stringParameter = " + stringOrNumberParameter);
    }
}
.

Другие советы

Обновление для ясности. Перегрузка метода в Teadercript - это полезная функция, поскольку он позволяет создавать определения типа для существующих библиотек с API, который необходимо представить.

При написании своего собственного кода, однако, вы вполне можете избежать познавательных накладных расходов перегрузок, используя необязательные параметры по умолчанию. Это более читаемая альтернатива для перегрузки метода, а также сохраняет ваш API честный, как вы избегаете создания перегрузок с неразрушающимся заказом.

Общий закон о перегрузках Tymdscript:

Если вы можете Удалите подписи перегрузки и все ваши тесты пропускают, вам не нуждаются в перегрузках Tearscript

Вы обычно можете достичь то же самое с необязательными или параметрами по умолчанию - или с типами Union, или с небольшим количеством объектной ориентации.

Фактический вопрос

Фактический вопрос просит перегрузку:

someMethod(stringParameter: string): void {

someMethod(numberParameter: number, stringParameter: string): void {
.

Теперь даже на языках, которые поддерживают перегрузки с отдельными реализациями (Примечание: Teamscript overloads Share - это единое реализация) - программисты являются советами для обеспечения согласованности в порядке. Это сделало бы подписи:

someMethod(stringParameter: string): void {

someMethod(stringParameter: string, numberParameter: number): void {
.

Генеракодицетагкод всегда требуется, поэтому он идет первым. Вы можете написать это в качестве рабочей перегрузки на типографию:

someMethod(stringParameter: string): void;
someMethod(stringParameter: string, numberParameter: number): void;
someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}
.

Но следуя закону перегрузок TypeScript, мы можем удалить подписи перегрузки, и все наши тесты все равно будут проходить.

someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}
.

Фактический вопрос, в фактическом порядке

Если вы были полны решимости сохраняться с оригинальным порядком, перегрузки будут:

someMethod(stringParameter: string): void;
someMethod(numberParameter: number, stringParameter: string): void;
someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}
.

Теперь это много разветвлений, чтобы выработать, где поставить параметры, но вы действительно хотели сохранить этот заказ, если вы читаете это далеко ... Но подождите, что произойдет, если мы применим закон TymerctScript Revloads? < / P >.

someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}
.

достаточно ветвления уже

Конечно, учитывая сумму проверки типа нам нужно сделать ... возможно, лучший ответ - просто иметь два метода:

someMethod(stringParameter: string): void {
  this.someOtherMethod(0, stringParameter);
}

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
.

Я желаю.Я тоже хочу эту функцию, но Skyscript должен быть совместимым с неразъедным JavaScript, который не имеет перегруженных методов.I. Если ваш перегруженный метод вызывается из JavaScript, то он может отправляться только к одному методу реализации.

Есть несколько соответствующих дискуссий на CodePlex.например

https://typescript.codeplex.com/workitem/617

Я все еще думаю, что Teadncript должен генерировать все, что если бы и переключение, поэтому нам не нужно это делать.

Почему бы не использовать Дополнительное свойство определенный интерфейс Аргумент функции ..

Для случая в этом вопросе, используя встроенный интерфейс, определенный с некоторыми дополнительными свойствами, только может напрямую сделать код как то ниже:

class TestClass {

    someMethod(arg: { stringParameter: string, numberParameter?: number }): void {
        let numberParameterMsg = "Variant #1:";
        if (arg.numberParameter) {
            numberParameterMsg = `Variant #2: numberParameter = ${arg.numberParameter},`;
        }
        alert(`${numberParameterMsg} stringParameter = ${arg.stringParameter}`);
    }
}

var testClass = new TestClass();
testClass.someMethod({ stringParameter: "string for v#1" });
testClass.someMethod({ numberParameter: 12345, stringParameter: "string for v#2" });
.

Потому что перегрузка, представленная в Tymdercript, как упомянуто в комментариях других, только в списке различных подписей функций, не поддерживая соответствующие коды реализации, таких как другие статические языки. Таким образом, реализация все еще должна быть сделана только в одном функциональном теле, что делает использование перегрузки функций в Teadercript не так удобно, как такие языки, поддерживающие реальную функцию перегрузки.

Тем не менее, есть еще много новых и удобных материалов, предоставляемых в Teadercript, который не доступен на устаревшем языке программирования, где необязательное поддержка свойств в анонимном интерфейсе является такого подходом для удовлетворения комфортабельной зоны от устаревшего функции, я думаю, ,

JavaScript не имеет никакой концепции перегрузки.TypeyScript не C # или Java.

Но вы можете реализовать перегрузку в Teadercript.

Прочитайте этот пост http://www.gyanparkash.in/function-/ a>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top