هل هناك طريقة للقيام طريقة التحميل الزائد في تيبسكريبت?

StackOverflow https://stackoverflow.com//questions/12688275

سؤال

هل هناك طريقة للقيام طريقة التحميل الزائد في اللغة تيبسكريبت?

أريد تحقيق شيء من هذا القبيل:

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

هنا مثال على ما لا أريد القيام به (أنا حقا أكره هذا الجزء من التحميل الزائد الإختراق في جس):

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);
هل كانت مفيدة؟

المحلول

وفقا للمواصفات، تقوم Bydscript بتحميل طريقة الدعم الزائد، ولكنها محرجة للغاية وتشمل الكثير من أنواع التحقق من العمل اليدوي من المعلمات.أعتقد أنه في الغالب لأن الأقرب الذي يمكنك الوصول إليه إلى طريقة التحميل الزائد في JavaScript العادي يتضمن هذا التحقق من أن المحاولات المحاولة أيضا عدم تعديل هيئات الأسلوب الفعلية لتجنب أي تكلفة أداء غير ضرورية لأجهزة التشغيل.

إذا فهمت بشكل صحيح، يجب عليك أولا كتابة إعلان طريقة لكل من الزائد، ثم One طريقة التنفيذ التي تتحقق من حججها التي تم استدعاء الحمل الزائد.يجب أن يكون توقيع التنفيذ متوافقا مع جميع الحمل الزائد. giveacodicetagpre.

نصائح أخرى

تحديث للوضوح.طريقة التحميل الزائد في تيبسكريبت هو ميزة مفيدة بقدر ما يسمح لك لإنشاء تعريفات نوع للمكتبات الموجودة مع أبي التي تحتاج إلى تمثيل.

عند كتابة التعليمات البرمجية الخاصة بك ، على الرغم من أنك قد تكون قادرة على تجنب الحمل المعرفي الزائد باستخدام المعلمات الاختيارية أو الافتراضية.هذا هو البديل الأكثر قابلية للقراءة للطريقة الزائدة ويحافظ أيضا على صدق واجهة برمجة التطبيقات الخاصة بك حيث ستتجنب إنشاء حمولات زائدة بترتيب غير بديهي.

القانون العام للأحمال الزائدة المطبوعة هو:

إذا كان يمكنك حذف التوقيعات الزائد وجميع الاختبارات الخاصة بك تمر ، لا تحتاج الزائد تيبسكريبت

يمكنك عادة تحقيق نفس الشيء مع المعلمات الاختيارية أو الافتراضية-أو مع أنواع الاتحاد ، أو مع القليل من اتجاه الكائن.

السؤال الفعلي

السؤال الفعلي يسأل عن الحمل الزائد من:

someMethod(stringParameter: string): void {

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

الآن حتى في اللغات التي تدعم التحميل الزائد مع تطبيقات منفصلة (ملاحظة:تشترك الأحمال الزائدة على الكتابة المطبوعة في تنفيذ واحد) - المبرمجون هم نصائح لتوفير الاتساق في الطلب.هذا من شأنه أن يجعل التوقيعات:

someMethod(stringParameter: string): void {

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

ال stringParameter مطلوب دائما ، لذلك يذهب أولا.هل يمكن أن يكتب هذا كما الزائد تيبسكريبت العمل:

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

ولكن بعد قانون الزائد تيبسكريبت ، يمكننا حذف التوقيعات الزائد وجميع اختباراتنا لا تزال تمر.

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

الآن هذا كثير من التفرع للعمل على مكان وضع المعلمات ، لكنك أردت حقا الحفاظ على هذا الترتيب إذا كنت تقرأ هذا الحد...لكن انتظر, ماذا يحدث إذا طبقنا قانون التحميل الزائد المطبوع?

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 {
  //...
}

أتمنى.أريد أن تكون هذه الميزة أيضا ولكن DIVELCRIPT يجب أن تكون قابلة للتشغيلية مع جافا سكريبت غير مصفوفة والتي لا تحتوي على أساليب مثقلة.I.E. إذا تم استدعاء طريقة التحميل الزائد من JavaScript، فيمكن أن يتم إرسالها إلا إلى تنفيذ طريقة واحدة.

هناك عدد قليل من المناقشات ذات الصلة على codeplex.على سبيل المثال

href="https://typescript.codeplex.com/workitem/617"> https://ttypescript.codeplex.com/workitem/617

ما زلت أفكر في أن أنفسنا يجب أن تولد كل ما إذا كان يجب أن نحتاج إلى القيام بذلك.

لماذا لا تستخدم واجهة الخصائص الاختيارية المعرفة وسيطة الوظيفة ..

للحصول على الحالة في هذا السؤال، باستخدام واجهة مضمنة محددة مع بعض الخصائص الاختيارية فقط يمكن أن تجعل التعليمات البرمجية مباشرة مثل شيء ما أدناه: giveacodicetagpre.

لأن التحميل الزائد المتوفر في Bydingcript هو، كما ذكر في تعليقات الآخرين، ما عليك سوى قائمة بالتوقيعات المختلفة الوظيفة دون دعم رموز التنفيذ المقابلة مثل اللغات الثابتة الأخرى. لذلك لا يزال يتعين القيام بالتنفيذ في هيئة وظيفة واحدة فقط، مما يجعل استخدام الوظيفة الزائدة في المحبوبة غير مريحة مثل هذه اللغات التي تدعم ميزة التحميل الزائد الحقيقي.

ومع ذلك، لا يزال هناك العديد من المواد الجديدة والملائمة المتوفرة في المحبوبة غير متوفرة في لغة البرمجة القديمة، حيث يكون دعم الممتلكات الاختياري في واجهة مجهولة مثل هذا النهج لتلبية المنطقة المريحة من التحميل الزائد للوظيفة القديمة، وأعتقد .

جافا سكريبت ليس لديه أي مفهوم التحميل الزائد.أنبثق ليس ج # أو جافا.

ولكن يمكنك تنفيذ التحميل الزائد في CUBENCRIPT.

اقرأ هذا المنصب http://www.gyanparkash.in/function-verloading-in-typescript/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top