2013-02-11 18 views
35

क्यों टाइपस्क्रिप्ट मुझे चेतावनी नहीं देता है कि जिस फ़ंक्शन को मैं परिभाषित कर रहा हूं वह इंटरफ़ेस घोषणा से मेल नहीं खाता है, लेकिन अगर मैं फ़ंक्शन का आह्वान करने का प्रयास करता हूं तो यह मुझे चेतावनी देता है।टाइपस्क्रिप्ट फ़ंक्शन इंटरफ़ेस

interface IFormatter { 
    (data: string, toUpper : boolean): string; 
}; 

//Compiler does not flag error here. 
var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

upperCaseFormatter("test"); //but does flag an error here. 

उत्तर

53

इंटरफेस सुनिश्चित करता है कि कि इंटरफ़ेस को लागू कार्यों के सभी कॉलर्स की आपूर्ति के लिए आवश्यक तर्क - data और toUpper

क्योंकि टाइपस्क्रिप्ट समझता है कि यदि आप तर्कों का उपयोग नहीं करते हैं तो जावास्क्रिप्ट को कोई फर्क नहीं पड़ता है, यह चालाकी से इसे कार्यान्वयन में अनुमति देता है।

यह ठीक क्यों है? क्योंकि इसका मतलब है कि आप कॉलिंग कोड को प्रभावित किए बिना इंटरफेस के किसी भी कार्यान्वयन को प्रतिस्थापित कर सकते हैं।

उदाहरण: आप या तो IFormatter कार्यान्वयन और कोड काम कर सकते हैं। जो कोड कम पठनीय बनाता है -

interface IFormatter { 
    (data: string, toUpper : bool): string; 
}; 

var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) { 
    if (toUpper) { 
     return data.toUpperCase(); 
    } 

    return data.toLowerCase(); 
} 

// Switch between these at will 
//var formatter = upperCaseFormatter; 
var formatter = variableCaseFormatter; 

formatter("test", true); 

टाइपप्रति ऐसा नहीं करते हैं, तो आपके upperCaseFormatter एक पैरामीटर toUpper कहा जाता है कि समारोह में कहीं भी उपयोग नहीं किया गया है करने के लिए होगा।

+0

लेकिन फिर 'upperCaseFormatter' का उपयोग करके एक अनावश्यक बूलियन मान होता है:' upperCaseFormatter ("test", true); // 'सत्य' को छोड़कर परिणामस्वरूप एक कंपाइलर चेतावनी होगी। तो इसके बजाय इंटरफेस गलत है और होना चाहिए: 'इंटरफेस IFormatter {(डेटा: स्ट्रिंग, toUpper?: बूल): स्ट्रिंग; } 'लेकिन इसका मतलब यह है कि आप 'variableCaseFormatter' को' variableCaseFormatter ('test') के साथ '' अपरिपर' निर्दिष्ट किए बिना 'फ़ंक्शन हस्ताक्षर में होने के बावजूद' का उपयोग कर सकते हैं। मेरे वर्तमान भ्रम के एक सरल उदाहरण के लिए यहां मेरा प्रश्न देखें: http://stackoverflow.com/questions/23305020 – AJP

+5

@AJP अगर आप स्वच्छ कोड लिख रहे थे, तो आप कभी भी वेरिएबल केस फॉर्मेटर नहीं लिखेंगे। आप एक वर्ग को ऊपरी और एक के लिए लिखेंगे और पूरी तरह से ग़लत बूलियन तर्क से बचेंगे। – Fenton

+0

@AJP अगर आप 'upperCaseFormatter' को सीधे कॉल करते हैं तो इंटरफ़ेस अप्रासंगिक है। –

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