Yöntem aşırı yükleme?

oy
75

Typescript dilinde yöntem aşırı yüklenmesini yapmanın bir yolu var mı?

Böyle bir şey başarmak istiyorum:

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

Burada (Ben gerçekten JS kesmek aşırı bir kısmının nefret) yapmak istemiyorum ne bir örnek:

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);
Oluştur 02/10/2012 saat 11:03
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
107

Patent açıklamasına göre, typescript destek yöntemi aşırı yüklenmesini yok, ama oldukça garip ve parametre türlerini kontrol manuel bir sürü iş kapsamaktadır. Ben düz JavaScript aşırı yönteme alabilirsiniz yakın çünkü çoğunlukla var çok kontrol edip typescript gereksiz çalışma zamanı performansı maliyetinden kurtulmak için gerçek bir yöntem organları değiştirmez çalıştığı içerir düşünüyorum.

Ben doğru anlamak, önce bir aşırı herbiri için yöntem beyanı ve sonra yazmak zorunda tek çağrıldığı aşırı yük karar verirken kendi argümanları denetler yöntem uygulanması. Uygulama imzası aşırı hepsiyle uyumlu olmak zorundadır.

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);
    }
}
Cevap 02/10/2012 saat 12:00
kaynak kullanıcı

oy
18

netlik için güncelleyin. Daktilo aşırı Yöntemi Eğer temsil gereken bir API ile mevcut kütüphaneler için tip tanımları oluşturmak için izin verdiği sürece yararlı bir özelliktir.

Kendi kod yazarken, gerçi, iyi seçmeli veya varsayılan parametreleri kullanarak aşırı bilişsel yükü önlemek mümkün olabilir. Bu yöntem aşırı için daha okunabilir bir alternatiftir ve ayrıca unintuitive sipariş ile aşırı yüklenmeleri oluşturmaktan kaçının edeceğiz gibi API dürüst tutar.

Typescript genel yasasıdır boğan:

Eğer aşırı yük imzaları silebilir ve testlerin hepsi geçerseniz, typescript aşırı yüklenmeleri gerekmez

Genellikle isteğe bağlı veya varsayılan parametrelerle aynı şeyi elde edebilirsiniz - Sendika türleriyle veya nesne yönelim biraz ya.

Gerçek soru

Gerçek bir soru bir aşırı sorar:

someMethod(stringParameter: string): void {

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

Şimdi bile ayrı uygulamalar (not: typescript aşırı yükler tek uygulanmasını paylaşan) ile aşırı yükleri destekleyen dilde - programcılar sıralamada tutarlılık sağlamak için öneriler yer almaktadır. Bu imzalar yapacak:

someMethod(stringParameter: string): void {

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

stringParameterİlk gider nedenle her zaman gereklidir. Bir çalışma typescript aşırı olarak bu yazabiliriz:

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

Ama typescript aşırı yasası sonrasında biz aşırı yük imzaları silebilir ve tüm testleri hala geçecek.

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

Gerçek Amacıyla Fiili Soru,

Eğer orijinal sıraya sürdürmeye belirlendi, yüklemeler olacaktır:

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

Eğer buraya kadar okuduğunuz ... ama bekle eğer biz typescript aşırı kanununu uygulamak ne olur, Şimdi bu parametreleri koymak için nereye çalışmak dallanma bir sürü, ama gerçekten bu düzeni korumak istedi?

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

Yeter dallanma Zaten

Tabii ki, yapmamız gereken tür denetleme miktarı göz önüne alındığında ... belki en iyi yanıtı iki yöntemine sahip olmak olduğunu:

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

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
Cevap 02/10/2012 saat 11:16
kaynak kullanıcı

oy
7

Keşke. Ben de bu özelliği istiyorum ama typescript aşırı yöntemleri var etmez untyped JavaScript ile birlikte çalışabilir olması gerekiyor. sizin aşırı yüklü yöntem JavaScript çağrılır yani, o zaman sadece bir yöntem uygulaması için sevk alabilirsiniz.

CodePlex üzerinde birkaç alakalı tartışmalar ayarlamanın sez \. Örneğin

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

Hala typescript tüm if'ing oluştursun ve böylece biz bunu yapmak için gerek olmazdı anahtarlama düşünüyorum.

Cevap 20/07/2013 saat 15:11
kaynak kullanıcı

oy
2

JavaScript aşırı yükleme herhangi bir kavram yoktur. Typescript c # veya Java değildir.

Ama daktilo aşırı uygulayabilirsiniz.

Bu yazı okuyun http://www.gyanparkash.in/function-overloading-in-typescript/

Cevap 08/12/2018 saat 06:15
kaynak kullanıcı

oy
1

Neden kullanmamaya opsiyonel özellik tanımlı arayüz fonksiyonu argüman olarak ..

Sadece doğrudan aşağıda bir şey gibi kod yapabiliriz bazı isteğe bağlı özelliklere sahip tanımlanan bir satır içi arayüzünü kullanarak bu söz konusu durum için:

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

Daktilo sağlanan aşırı yüklenmesini Çünkü olduğunu başkalarının yorumlarına, diğer statik diller gibi karşılık gelen uygulama kodlarını destekleyen olmadan işlevin farklı imzalar sadece bir listede belirtildiği gibi. Yani uygulama hala gerçek aşırı yükleme özelliğini destekleyen bu tür dilleri gibi rahat değil daktilo aşırı fonksiyonunun kullanımını kılan tek tek fonksiyon vücudunda yapılması gerekmektedir.

Ancak, yine de anonim bir arayüzde opsiyonel özellik desteği, böyle bir yaklaşımın eski işlevi aşırı yüklenme konforlu bölgeyi araya gelecek eski programlama dilinde mevcut değildir daktilo sağlanan birçok yeni ve kullanışlı maddeleri vardır diye düşünüyorum.

Cevap 10/12/2017 saat 15:12
kaynak kullanıcı

oy
0
class User{
   name : string;
   age : number;
   constructor(name:string,age:number){
    this.name = name;
    this.age = age;
    console.log("User " +this.name+ " Created")
}
getName(name:string = ""):string{
    if(name != ""){
        return name + " " +this.name;
    }else{
        return this.name;
    }
  }

}

Ben bu işe gerektiğini düşünüyorum

Cevap 28/06/2017 saat 05:50
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more