मुझे टाइपस्क्रिप्ट का उपयोग करके एक विधि को अधिभारित करने की आवश्यकता है।

FooModel में 6 पैरामीटर हैं, लेकिन केवल 2 स्ट्रिंग पैरामीटर ही अनिवार्य पैरामीटर हैं। इसलिए हर बार जब मैं myMethod का उपयोग करना चाहता हूं तो FooModel बनाने के बजाय, मैं myMethod को ओवरलोड करना चाहता हूं और FooModel बनाना चाहता हूं। मजबूत> एक बार वहाँ और फिर वापसी से पहले बाकी तर्क।

मैंने अब तक जो कुछ भी ऑनलाइन पाया है, उसके आधार पर मैंने यह कोशिश की है, लेकिन मुझे निम्न त्रुटि मिलती है:

TS2394: This overload signature is not compatible with its implementation signature.

इस त्रुटि का समाधान मेरी पद्धति के अनुकूल नहीं है

    static async myMethod(model: FooModel): Promise<BarResult>
    static async myMethod(inputText: string, outputText: string): Promise<BarResult>{
         //implementation;
      return new BarResult(); //Different content based on the inputs
    }
1
wojiyuk 22 अक्टूबर 2021, 12:50
1
कृपया प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रदान करें
 – 
captain-yossarian
22 अक्टूबर 2021, 12:53

1 उत्तर

सबसे बढ़िया उत्तर

संकट

टाइपस्क्रिप्ट के दस्तावेज़ीकरण से:

अधिभार हस्ताक्षर और कार्यान्वयन हस्ताक्षर

यह भ्रम का एक सामान्य स्रोत है। अक्सर लोग इस तरह कोड लिखेंगे और समझ नहीं पाएंगे कि त्रुटि क्यों है:

function fn(x: string): void;
function fn() {
  // ...
}
// Expected to be able to call with zero arguments
fn();
^^^^
Expected 1 arguments, but got 0.

फिर से, फ़ंक्शन बॉडी को लिखने के लिए उपयोग किए जाने वाले हस्ताक्षर को बाहर से "देखा" नहीं जा सकता है।

कार्यान्वयन के हस्ताक्षर बाहर से दिखाई नहीं दे रहे हैं। एक अतिभारित फ़ंक्शन लिखते समय, आपके पास फ़ंक्शन के कार्यान्वयन के ऊपर हमेशा दो या दो से अधिक हस्ताक्षर होने चाहिए।

कार्यान्वयन हस्ताक्षर भी अधिभार हस्ताक्षर के साथ संगत होना चाहिए। उदाहरण के लिए, इन कार्यों में त्रुटियां हैं क्योंकि कार्यान्वयन हस्ताक्षर सही तरीके से अधिभार से मेल नहीं खाता है:

function fn(x: boolean): void;
// Argument type isn't right
function fn(x: string): void;
         ^^
This overload signature is not compatible with its implementation signature.

function fn(x: boolean) {}
function fn(x: string): string;
// Return type isn't right
function fn(x: number): boolean;
         ^^
This overload signature is not compatible with its implementation signature.

function fn(x: string | number) {
  return "oops";
}

- ओवरलोड पर टाइपस्क्रिप्ट प्रलेखन और कार्यान्वयन हस्ताक्षर

आपके मामले में आपने निम्नलिखित अधिभार हस्ताक्षर को परिभाषित किया है:

static async myMethod(model: FooModel): Promise<BarResult>

लेकिन कार्यान्वयन हस्ताक्षर में कोई ओवरलैप नहीं है। आपके कार्यान्वयन हस्ताक्षर में पहला तर्क string है जबकि अधिभार FooModel है जबकि कार्यान्वयन हस्ताक्षर में दूसरा तर्क string है जबकि अधिभार undefined है।

static async myMethod(inputText: string, outputText: string): Promise<BarResult>{

समाधान

अपने वर्तमान कार्यान्वयन हस्ताक्षर को एक अधिभार में बदलें और एक कार्यान्वयन हस्ताक्षर जोड़ें जो आपके दोनों अधिभारों के अनुकूल हो:

class Foo {
  static async myMethod(model: FooModel): Promise<BarResult>;
  static async myMethod(inputText: string, outputText: string): Promise<BarResult>;
  static async myMethod(modelOrInputText: string | FooModel, outputText?: string): Promise<BarResult>{
   //implementation;
    return new BarResult(); //Different content based on the inputs
  }
}

- टाइपप्रति खेल का मैदान

1
Wing 22 अक्टूबर 2021, 13:10
यह एक आकर्षण की तरह काम करता है। धन्यवाद
 – 
wojiyuk
22 अक्टूबर 2021, 14:55