2013-12-17 4 views
10

मैं पारंपरिक रूप से कुछ वर्गों परिवर्तित कर दिया है:कक्षा विधियों के लिए वसा तीर वाक्यविन्यास का उपयोग करते समय मैं टाइपस्क्रिप्ट ओवरलोड का उपयोग कर सकता हूं?

class TestOverloads { 
    private status = "blah"; 
    public doStuff(selector: JQuery); 
    public doStuff(selector: string); 
    public doStuff(selector: any) { 
     alert(this.status); 
    } 
} 

बजाय तीर समारोह एक्सप्रेशन का उपयोग करना:

class TestOverloads2 { 
    private status = "blah"; 
    public doStuff = (selector: any) => { 
     alert(this.status); 
    } 
} 
तो

जब वर्ग तरीकों एक कॉलबैक में उपयोग किया जाता समस्याओं देखते हुए से बचने के लिए के रूप में (पृष्ठभूमि के लिए here देखें)।

मैं अपने अधिभारित फ़ंक्शन हस्ताक्षर को फिर से बनाने के तरीके के बारे में काम नहीं कर सकता हूं। वसा तीर का उपयोग करते समय मैं अपने अधिभार कैसे लिखूं?

+0

Do विधियों के लिए वसा तीर का उपयोग न करें। यह वर्ग की संपत्ति बन जाएगा, प्रोटोटाइप विधि नहीं। – garkin

उत्तर

15

आप एक इनलाइन प्रकार कॉल के लिए शाब्दिक लिख सकते हैं समारोह हस्ताक्षर का समर्थन करता है:

class TestOverloads2 { 
    private status = "blah"; 
    public doStuff: { 
     (selector: JQuery): void; 
     (selector: string): void; 
    } = (selector: any) => { 
     alert(this.status); 
    } 
} 

यही कारण है, एक तरह से घृणित है, तो आप के बजाय एक इंटरफ़ेस में निकालने के लिए चाहते हो सकता है:

interface SelectByJQueryOrString { 
    (selector: JQuery): void; 
    (selector: string): void; 
} 

class TestOverloads3 { 
    private status = "blah"; 
    public doStuff: SelectByJQueryOrString = (selector: any) => { 
     alert(this.status); 
    } 
} 
+0

इंटरफ़ेस प्रकार एनोटेशन एक अच्छा विचार है। – Fenton

+0

अच्छा, धन्यवाद रयान! –

+0

नोट: इस बारे में सीखने में, मैं इस टीएस डॉस और डोंट्स में आया: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html नीचे उपयोग यूनियन प्रकार अनुभाग में पृष्ठ, यह एकल-स्थिति अधिभार के लिए यूनियनों का उपयोग करने का उल्लेख करता है। तो इस उदाहरण में, यह 'चयनकर्ता: JQuery | स्ट्रिंग) होगा: परिभाषा के लिए शून्य'। मैं सोच रहा हूं, क्या वास्तविक उदाहरण भी 'किसी भी' के बजाय संघ होना चाहिए? - '... = (चयनकर्ता: JQuery | स्ट्रिंग) => {चेतावनी ...' – ibgib

3

यह एक तकनीकीता है, लेकिन अब आप कोई फ़ंक्शन नहीं बना रहे हैं, आप एक संपत्ति बना रहे हैं (जो एक फ़ंक्शन होता है)।

हालांकि आप अधिभार के बजाय नामकरण का उपयोग करके अपनी समस्या का समाधान कर सकते हैं। this.sharedStuff():

class TestOverloads2 { 
    private status = "blah"; 
    public doStuffWithSelector = (selector: string) => { 
     alert(this.status); 
    } 
    public doStuffWithJqueryObject = (jqo: JQuery) => { 
     alert(this.status); 
    } 
} 

यदि वहाँ महत्वपूर्ण दोहराव, आप एक आम समारोह है कि दोनों का नाम कार्यों उदाहरण के लिए, फोन में डाल सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे