2012-10-04 25 views
62

में फ़ंक्शंस के लिए रिटर्न प्रकार कैसे घोषित करें I http://go.microsoft.com/fwlink/?LinkId=267238 पर चेक किया गया है जो TypeScript Language Specifications है लेकिन मुझे एक बात नहीं दिखाई दे रही है कि मैं फ़ंक्शन का रिटर्न प्रकार कैसे घोषित कर सकता हूं। मैं पता चला है कि मैं क्या नीचे कोड में उम्मीद कर रहा था: greet(name:string) :string {}टाइपस्क्रिप्ट

class Greeter { 
    greeting: string; 
    constructor (message: string) { 
     this.greeting = message; 
    } 
    greet() : string{ 
     return "Hello, " + this.greeting; 
    } 
} 

मैं देख रहा हूँ कि हम कुछ (name:string) => any उपयोग कर सकते हैं, लेकिन वे ज्यादातर जब कॉलबैक कार्यों के आसपास गुजर उपयोग किया जाता है:

function vote(candidate: string, callback: (result: string) => any) { 
// ... 
} 
+0

आपका कोड सही तरीके से अपने 'नमस्कार()' समारोह पर वापसी प्रकार की घोषणा की। आपकी क्या समस्या हैं? –

+1

मुझे यह था कि मुझे नहीं पता था कि यह सही था। यह वही था जो मैं देखने की उम्मीद कर रहा था और जो देखने की उम्मीद कर रहा था वह सही होने के लिए हुआ था। एलओएल :) – Tarik

+1

मुझे नहीं लगता कि डाउनवोट आवश्यक था! – Tarik

उत्तर

57

आप सही कर रहे हैं - यहाँ है एक पूरी तरह से काम कर रहा उदाहरण - आप देखेंगे कि var result निहित रूप से एक स्ट्रिंग है क्योंकि वापसी प्रकार greet() फ़ंक्शन पर निर्दिष्ट है। प्रकार को number पर बदलें और आपको चेतावनियां मिलेंगी।

class Greeter { 
    greeting: string; 
    constructor (message: string) { 
     this.greeting = message; 
    } 
    greet() : string { 
     return "Hello, " + this.greeting; 
    } 
} 

var greeter = new Greeter("Hi"); 
var result = greeter.greet(); 

यहाँ संख्या उदाहरण है - आप खेल के मैदान संपादक में लाल उतार दिखाई देगा, जब कोशिश यह:

greet() : number { 
    return "Hello, " + this.greeting; 
} 
+0

धन्यवाद, यह देखना अच्छा है कि मैं जो उम्मीद कर रहा था वह सही होना था! – Tarik

14

आप अनुभागों 3.5.3.5 में language specification में समारोह प्रकार के बारे में अधिक पढ़ सकते हैं और 3.5.5।

टाइपस्क्रिप्ट कंपाइलर जब यह कर सकता है तो इसका अनुमान लगाएगा, और ऐसा किया जाता है आपको स्पष्ट प्रकार निर्दिष्ट करने की आवश्यकता नहीं है। इसलिए ग्रीटर उदाहरण के लिए, नमस्कार() एक स्ट्रिंग शाब्दिक देता है, जो संकलक को बताता है कि फ़ंक्शन का प्रकार एक स्ट्रिंग है, और किसी प्रकार को निर्दिष्ट करने की आवश्यकता नहीं है। इसलिए उदाहरण के लिए, इस नमूने में, मेरे पास ग्रीटिंग क्लास है जो एक ग्रीटिंग विधि है जो एक स्ट्रिंग देता है, और एक वेरिएबल जो अक्षर को असाइन किया जाता है। कंपाइलर दोनों प्रकारों का अनुमान लगाएगा और यदि आप किसी संख्या को स्ट्रिंग असाइन करने का प्रयास करते हैं तो आपको एक त्रुटि मिल जाएगी।

class Greeter { 
    greet() { 
     return "Hello, "; // type infered to be string 
    } 
} 

var x = 0; // type infered to be number 

// now if you try to do this, you will get an error for incompatable types 
x = new Greeter().greet(); 

इसी तरह, इस नमूने संकलक, जानकारी दी के रूप में एक त्रुटि का कारण होगा, प्रकार तय करने के लिए कोई रास्ता नहीं है, और जहाँ आप एक स्पष्ट वापसी प्रकार होनी चाहिए कि यह एक जगह होगी।

function foo(){ 
    if (true) 
     return "string"; 
    else 
     return 0; 
} 

लेकिन यह काम करेगा:

function foo() : any{ 
    if (true) 
     return "string"; 
    else 
     return 0; 
} 
+2

अंतिम अनुच्छेद के लिए धन्यवाद! – Tarik

+1

कुछ मामलों में, आपके पास दो अलग-अलग प्रकार की वापसी हो सकती है ताकि आप इसका उपयोग कर सकें। (पाइप) सभी संभावित रिटर्न प्रकार घोषित करने के लिए: '' 'फ़ंक्शन foo(): स्ट्रिंग | संख्या {}' '' – Snook

1
functionName() : ReturnType { ... } 
संबंधित मुद्दे