2015-10-28 9 views
5

चलें कहते हैं कि हम इस तरह स्पष्ट टाइपिंग का उपयोग कर एक समारोह को परिभाषित,टाइपस्क्रिप्ट में फ़ंक्शंस पर ':' और '=>' के बीच क्या अंतर है?

var func : (arg1: string, arg2: number) => boolean; 

के रूप में आप देख सकते हैं हम उपयोग किया जाना चाहिए '=>' यहाँ, लेकिन हम अपने समारोह decleration में इस वसा तीर का उपयोग नहीं कर सकते।

func = function name(arg1: string, arg2: number) : boolean {return true;} 

लेकिन लैम्ब्डा फ़ंक्शन में हम इस वसा तीर का उपयोग करते हैं '=>' क्यों?

var lambdaFunc = (arg1: string, arg2: number) => true; 

और फ़ंक्शन टाइप किए गए इंटरफेस में हम इस उदाहरण का उपयोग क्यों करते हैं, हम ':' कोलन का उपयोग करते हैं।

interface SearchFunc { 
(source: string, subString: string): boolean; 
} 

यह पूरा भ्रम क्या है?

उत्तर

1

चलें कहते हैं कि हम इस, वर समारोह की तरह स्पष्ट टाइपिंग का उपयोग कर एक समारोह को परिभाषित: (ARG1: स्ट्रिंग, ARG2: संख्या) => बूलियन; जैसा कि आप देख सकते हैं कि हमें '=>'

का उपयोग करना चाहिए। यह एक शॉर्टेंड है।

var func : {(arg1: string, arg2: number): boolean;} 

लेकिन लैम्ब्डा में समारोह, उदा, '=>' इस वसा तीर कारण है कि हम का उपयोग करें: लंबे हाथ : का उपयोग करता है? var lambdaFunc = (arg1: string, arg2: संख्या) => बूलियन;

सत्य नहीं है। आप अभी भी : का उपयोग करते हैं। अर्थात

var lambdaFunc = (arg1: string, arg2: number):boolean => true; 

और समारोह टाइप किया इंटरफेस कारण है कि हम इस का उपयोग उदा, हम उपयोग में ':' पेट।

बिल्कुल, हम : का उपयोग अन्य उदाहरणों की तरह करते हैं जैसे आप यहां पेश कर रहे हैं।

कम

में आशुलिपि भ्रामक और अजीब एक बाहर है। यह पसंद नहीं है? लंबे हाथ

6

वहाँ क्या दोनों वाक्यविन्यास (एक समारोह के रिटर्न मान) का प्रतिनिधित्व करते हैं, लेकिन आम तौर पर बोल में कोई अंतर नहीं है का उपयोग करें, : वाक्य रचना समारोह में उपयोग के लिए है घोषणाओं और => वाक्य रचना में इस्तेमाल के लिए है फ़ंक्शन अभिव्यक्ति। (इन दो चीजों के बीच अंतर के अवलोकन के लिए Javascript function declarations vs function operators पढ़ें।)

कोलन सिंटैक्स कम से कम त्याग किए गए एक्मास्क्रिप्ट 4 विनिर्देश के लिए वापस आता है जो इस वाक्यविन्यास का उपयोग करके प्रकार एनोटेशन पेश करता है। तीर सिंटैक्स arrow function expression से एक्मास्क्रिप्ट 6 में आता है जो फ़ंक्शन "कीवर्ड" के रूप में वसा तीर प्रतीक का उपयोग करता है। तीर सिंटैक्स उन स्थानों के लिए एक शॉर्टेंड प्रदान करता है जहां कोलन का उपयोग किया जाने पर अस्पष्टता होगी, और इन मामलों में दृष्टि से पार्स करना आम तौर पर आसान होता है।

उदाहरण के लिए

, एक समारोह है कि एक कॉलबैक स्वीकार करता है, : का उपयोग कर का प्रतिनिधित्व करने के कॉलबैक की वापसी प्रकार {} साथ प्रकार लपेटकर के बिना असंभव है को देखते हुए, लेकिन => साथ सरल है:

// ambiguous parse, syntax error 
function sendString(callback: (value: string): void); 

// valid, using fat arrow 
function sendString(callback: (value: string) => void); 

// same thing, using curly brackets 
// (harder to write, harder to parse visually) 
function sendString(callback: { (value: string): void; }); 

में कक्षाओं, कार्यों के लिए वसा तीर वाक्यविन्यास का उपयोग करना संभव है, लेकिन विधियों के लिए नहीं, उदाहरण के लिए:

class Foo { 
    // In TypeScript’s eyes, this is actually a 
    // property, not a method! 
    someMethod: (value: string) => boolean; 
} 

इस मामले में, टाइपस्क्रिप्ट एक कक्षा के गुण और कक्षा के विधियों के बीच एक अंतर बनाता है। इस तरह के गुणों के रूप में परिभाषित कार्यों को शरीर की आवश्यकता नहीं है, लेकिन उप-वर्गों में विधियों के रूप में ओवरराइड या परिभाषित नहीं किया जा सकता है। दूसरे शब्दों में, आप ऐसा कर सकता है नहीं है, भले ही हस्ताक्षर कर रहे हैं 'उपयुक्त':

class Bar extends Foo { 
    // nope! 
    someMethod(value: string): boolean { 
    return true; 
    } 
} 

अंत में, जिस तरीके प्रकार वाक्य रचना टाइपप्रति में काम करता है, यह हमेशा उपयोग करना संभव है किसी भी फ़ंक्शन प्रकार के लिए कोलन सिंटैक्स, लेकिन यह तीर सिंटैक्स का उपयोग करने के लिए हमेशा संभव है। सबसे महत्वपूर्ण बात यह है कि कोड लिखना स्पष्ट और पठनीय है, इसलिए सिंटैक्स का उपयोग करें जो स्थिति के लिए सबसे उपयुक्त है। आम तौर पर इसका मतलब कॉलबैक पैरामीटर के लिए => और अन्य सभी चीज़ों के लिए : का उपयोग करना है।

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