টাইপস্ক্রিপ্টে পদ্ধতি ওভারলোডিং করার কোনও উপায় আছে কি?


108

টাইপস্ক্রিপ্ট ভাষায় পদ্ধতি ওভারলোডিং করার কোনও উপায় আছে কি?

আমি এরকম কিছু অর্জন করতে চাই:

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

1
হ্যাঁ, একটি সুযোগ আছে, ভাষাটি এখনও মারা যায় নি। আর কোন প্রশ্ন?
hakre

6
@hakre এটি অবাক করা বিষয়, টাইপস্ক্রিপ্ট বিবেচনা করা ইতিমধ্যে সমর্থন পদ্ধতি ওভারলোডিং করে method
সোভিক 11

@ এসভিক: আচ্ছা, আপনি কি সেই পদ্ধতিটিকে ওভারলোডিং বলছেন? আপনার উত্তরে পদ্ধতিটি নিজেই ওভারলোড হয় না, একটি দেহ যদি চারপাশে থাকে।
হ্যাক্রে

2
@hakre স্পেসিফিকেশন এটিকে ওভারলোডিং পদ্ধতিটি বলে। আপনি অবশ্যই যুক্তি দিতে পারেন যে এটি এর কোনও বিশেষ সংস্করণ নয়, তবে আমি মনে করি আপনি এটি বলতে পারবেন না যে এটির কোনও অস্তিত্ব নেই।
সোভিক 11

@ এসভিক: আমিও বলিনি। তবে এটি আমার কাছে মনে হচ্ছে যে ওপি জিজ্ঞাসা করার সম্ভাবনাগুলি পদ্ধতি ওভারলোডিংয়ের মানসিক মডেল সম্পর্কে নির্দিষ্ট। চুল বিভক্ত করার জন্য আমরা বলতে পারি যে এটির পদ্ধতি স্বাক্ষর ওভারলোডিং;)
হ্যাক্রে

উত্তর:


165

স্পেসিফিকেশন অনুসারে, টাইপস্ক্রিপ্টটি ওভারলোডিং পদ্ধতিটি সমর্থন করে তবে এটি বেশ বিশ্রী এবং এতে অনেকগুলি ম্যানুয়াল কাজ পরীক্ষার ধরণের পরামিতি রয়েছে। আমার মনে হয় এটি বেশিরভাগ কারণ, আপনি সরল জাভাস্ক্রিপ্টে সবচেয়ে বেশি পদ্ধতিতে ওভারলোডিং পেতে পারেন এর মধ্যে রয়েছে যে খুব বেশি পরীক্ষা করা এবং টাইপস্ক্রিপ্ট কোনও অপ্রয়োজনীয় রানটাইম পারফরম্যান্স ব্যয় এড়াতে আসল পদ্ধতিতে সংশোধন না করার চেষ্টা করে।

যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে আপনাকে প্রথমে প্রতিটি ওভারলোডের জন্য একটি পদ্ধতি ঘোষণা লিখতে হবে এবং তারপরে একটি পদ্ধতি প্রয়োগ করে কোন ওভারলোড ডাকা হয়েছে তা নির্ধারণের জন্য তার যুক্তিগুলি পরীক্ষা করে। বাস্তবায়নের স্বাক্ষরটি ওভারলোডগুলির সাথে সমস্তটির সাথে সামঞ্জস্য করতে হবে।

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

3
@ নিকোভ্যানবেল জাভাস্ক্রিপ্ট মোটেও পদ্ধতি ওভারলোডিং সমর্থন করে না, তাইনা? তাহলে কীভাবে জেএসে ফিরে যাচ্ছে সহায়তা করতে?
এসভিচ

ইন্টারফেস চেক সম্পর্কে কি? এর থেকেও কি আপনার আরও ভাল সমাধান আছে: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 14425568/… ?
ডাইপিক্স

হুম .. আমি আসলে এটি পছন্দ করি না, পরিবর্তে কেবল একটি optionচ্ছিক প্যারামিটার রাখা ভাল।
লাকলিলেকি

3
আমি মনে করি এখানে কী গুরুত্বপূর্ণ তা যদি বিবৃতি দেয় তবে এটি আপনার কোডকে এক টন টাইপচেকিং ছাড়াই পঠনযোগ্য রাখে। এটি কী পরিবহণ করে তা কে যত্ন করে।
Brain2000

34

স্পষ্টতার জন্য আপডেট। টাইপস্ক্রিপ্টে মেথড ওভারলোডিং একটি দরকারী বৈশিষ্ট্য ইনসোফার কারণ এটি আপনাকে এমন একটি এপিআই সহ বিদ্যমান লাইব্রেরিগুলির জন্য টাইপ সংজ্ঞা তৈরি করতে দেয় যা প্রতিনিধিত্ব করতে হবে।

আপনার নিজের কোডটি লেখার সময়, আপনি overচ্ছিক বা ডিফল্ট পরামিতিগুলি ব্যবহার করে ওভারলোডগুলির জ্ঞানীয় ওভারহেড এড়াতে সক্ষম হতে পারেন। এটি পদ্ধতি ওভারলোডের জন্য আরও পঠনযোগ্য বিকল্প এবং এটি আপনার এপিআইকেও সৎ রাখে কারণ আপনি অপ্রয়োজনীয় ক্রম দিয়ে ওভারলোডগুলি এড়াতে পারবেন না।

টাইপস্ক্রিপ্ট ওভারলোডগুলির সাধারণ আইনটি হ'ল:

আপনি যদি ওভারলোডের স্বাক্ষরগুলি এবং আপনার সমস্ত পরীক্ষা পাস করে মুছে ফেলতে পারেন তবে আপনার টাইপস্ক্রিপ্ট ওভারলোডের দরকার নেই

আপনি সাধারণত একই জিনিসটি alচ্ছিক বা ডিফল্ট পরামিতিগুলি - বা ইউনিয়নের ধরণের সাথে বা কিছুটা অবজেক্ট-ওরিয়েন্টেশন দিয়ে অর্জন করতে পারেন।

আসল প্রশ্ন

আসল প্রশ্নটি একটি ওভারলোডের জন্য জিজ্ঞাসা করে:

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

আসল প্রশ্ন, আসল আদেশে

যদি আপনি মূল ক্রমটি ধরে রাখতে দৃ determined় সংকল্পবদ্ধ হন, তবে ওভারলোডগুলি হ'ল:

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

যা সাধারণত পদ্ধতি ওভারলোডিং হিসাবে পরিচিত হয় না। প্রশ্নটি দেখুন, প্রথম প্যারামিটারের ধরন পরিবর্তন হয়।
hakre

3
আমি স্বীকার করেছি যে আমার উত্তরে - আপনি alচ্ছিক প্যারামিটারটি শেষ রাখবেন, সুতরাং numberপ্যারামিটারটি দ্বিতীয় যুক্তি হবে এবং এটি alচ্ছিক হবে। টাইপসক্রিপ্ট "যথাযথ" পদ্ধতি ওভারলোডগুলি সমর্থন করে না - তবে সি # বিশ্ব ওভারলোডগুলি থেকে alচ্ছিক পরামিতিগুলির দিকে সরে যাচ্ছে কারণ অনেক ক্ষেত্রে এটি আরও পাঠযোগ্য কোডের দিকে নিয়ে যায়।
ফেন্টন

আপনার অর্থ if (typeof numberParameter != 'undefined'), ডান;)
হুয়ান মেন্ডিস

এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে, বিশেষত আপনি জিরো গ্রহণ করেন কিনা। আপনার যদি এটি করার প্রয়োজন হয় তবে !==জাগল এড়াতে ব্যবহার করতে ভুলবেন না।
ফেন্টন

1
@ সেবাস্তিয়ান যা নির্ভরতা ইনজেকশনের জন্য একটি সুযোগ বলে মনে হচ্ছে। টাইপস্ক্রিপ্টে যে পদ্ধতিটি ওভারলোডিং দেওয়া হয়েছে তাতে একাধিক সজ্জা, ডিফল্ট প্যারামিটার এবং ইউনিয়ন প্রকারের একটি একক পদ্ধতি জড়িত, একটি আরও ভাল অভিজ্ঞতা সরবরাহ করে। যদি পদ্ধতিগুলি আরও উল্লেখযোগ্য উপায়ে পৃথক হয়, আপনি হয় একটি বিমূর্ততা ব্যবহার করেন, বা একাধিক পদ্ধতি প্রয়োগ করেন।
ফেন্টন

7

আমি চাই. আমি এই বৈশিষ্ট্যটিও চাই তবে টাইপস্ক্রিপ্টটি অপ্রচলিত জাভাস্ক্রিপ্টের সাথে আন্তঃযোগযোগ্য হওয়া দরকার যার ওভারলোডেড পদ্ধতি নেই। অর্থ্যাৎ যদি আপনার ওভারলোডেড পদ্ধতিটি জাভাস্ক্রিপ্ট থেকে কল করা হয় তবে এটি কেবল একটি পদ্ধতি প্রয়োগের জন্য প্রেরণ করতে পারে।

কোডেপ্লেক্স সম্পর্কিত কয়েকটি প্রাসঙ্গিক আলোচনা আছে। যেমন

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

আমি এখনও মনে করি টাইপস্ক্রিপ্টের সমস্ত if'ing এবং স্যুইচিং করা উচিত যাতে আমাদের এটি করার দরকার হয় না।


2

কেন alচ্ছিক সম্পত্তি সংজ্ঞায়িত ইন্টারফেসটি ফাংশন আর্গুমেন্ট হিসাবে ব্যবহার করবেন না ..

এই প্রশ্নের ক্ষেত্রে, কিছু alচ্ছিক বৈশিষ্ট্যগুলির সাথে সংজ্ঞায়িত একটি ইনলাইন ইন্টারফেস ব্যবহার করা কেবল নীচের মতো কিছুর মতো সরাসরি কোড তৈরি করতে পারে:

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

কারণ টাইপস্ক্রিপ্টে সরবরাহ করা ওভারলোডিং যেমন অন্যের মন্তব্যগুলিতে উল্লিখিত হয়, ঠিক তেমন স্ট্যাটিক ভাষার মতো বাস্তবায়ন কোডকে সমর্থন না করে ফাংশনের বিভিন্ন স্বাক্ষরের একটি তালিকা। সুতরাং বাস্তবায়নটি এখনও কেবল একটি ফাংশন বডিতেই করতে হবে, যা টাইপস্ক্রিপ্টে ফাংশন ওভারলোডিংয়ের ব্যবহার যেমন প্রকৃত ওভারলোডিং বৈশিষ্ট্য সমর্থন করে এমন ভাষাগুলির মতো স্বাচ্ছন্দ্যজনক নয়।

যাইহোক, টাইপসক্রিপ্টে এখনও অনেকগুলি নতুন এবং সুবিধাজনক স্টাফ সরবরাহ করা আছে যা উত্তরাধিকার প্রোগ্রামিং ভাষার ক্ষেত্রে পাওয়া যায় না, যেখানে কোনও বেনামে ইন্টারফেসে alচ্ছিক সম্পত্তি সমর্থনটি উত্তরাধিকারের ফাংশন ওভারলোডিং থেকে আরামদায়ক অঞ্চলটি পূরণের জন্য এমন একটি পদ্ধতির বলে মনে করি।


0

যদি পদ্ধতি ওভারলোডগুলির প্রচুর প্রকরণ হয়, তবে অন্য উপায়টি হ'ল ভিতরে আপনার সমস্ত আরোগুলি সহ একটি শ্রেণী তৈরি করা। সুতরাং আপনি যে কোনও ক্রমে কেবলমাত্র প্যারামিটারটিই পাস করতে পারেন।

class SomeMethodConfig {
  stringParameter: string;
  numberParameter: number;

 /**
 *
 */
 constructor(stringParameter: string = '012', numberParameter?: number) { // different ways to make a param optional
   this.numberParameter = 456; // you can put a default value here
   this.stringParameter = stringParameter; // to pass a value throw the constructor if necessary
 }
}

এছাড়াও আপনি ডিফল্ট মান সহ একটি কনস্ট্রাক্টর তৈরি করতে পারেন এবং / অথবা কিছু বাধ্যতামূলক আর্গুমেন্ট পাস করতে পারেন। তারপরে ঠিক এটি ব্যবহার করুন:

const config = new SomeMethodConfig('text');
config.numberParameter = 123; // initialize an optional parameter only if you want to do it
this.SomeMethod(config);

-2

জাভাস্ক্রিপ্টের ওভারলোডিংয়ের কোনও ধারণা নেই। টাইপস্ক্রিপ্ট সি # বা জাভা নয়।

তবে আপনি টাইপস্ক্রিপ্টে ওভারলোডিং বাস্তবায়ন করতে পারেন।

এই পোস্টটি পড়ুন http://www.gyanparkash.in/function-overloading-in-typescript/


দুর্ভাগ্যক্রমে, লিঙ্কটি নষ্ট হয়ে গেছে। আপনি কি পুনরায় পোস্ট করতে পারেন?
এলএইচএম

@ এলএমএইচ: এজন্য কেবল লিংক-উত্তরগুলি নিরুৎসাহিত করা হচ্ছে।
ড্যান ড্যাসকলেস্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.