टाइपप्रति: शून्य वापसी प्रकार किसी भी प्रकार के लिए परिवर्तित?

वोट
17

मैं समझने के लिए क्यों निम्नलिखित कोड त्रुटि उठाना नहीं है सक्षम नहीं हो पा रहे:

var rg: {(): void;}[] = [];
rg.push(function():string {return ;})

मैं स्पष्ट रूप से उल्लेख है कि प्रकार कार्यों कि वापसी की एक सरणी होना चाहिए void, फिर भी मैं वहाँ एक समारोह है कि एक रिटर्न धक्का stringऔर अभी तक संकलक शिकायत नहीं है। मैं की परिभाषा को बदलते हैं rgकरने के लिए

var rg: {():number;}[] = [];

संकलक शिकायत करने के लिए शुरू होता है।

यह एक बग है या कैसे शून्य वापसी प्रकार काम करने के लिए माना जाता है यह है (यानी कुछ भी करता है, तो हो जाता है void, प्रयोग किया जाता है मूल रूप से यह वापसी प्रकार के रूप में ही कर रही है any)?

06/10/2012 को 17:34
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
17

इस डिजाइन के द्वारा होता है (मैं क्यों यह अच्छे डिजाइन शीघ्र ही है की व्याख्या करेंगे)। कल्पना का कहना है (खंड 3.6.3 में, स्पष्टता के लिए संक्षिप्त):

एक प्रकार एस एक प्रकार टी करने के लिए आबंटित है, और टी एस से आबंटित है, अगर निम्न में से एक सच है ...

  • एस और टी वस्तु प्रकार के होते हैं और, टी में प्रत्येक सदस्य एम के लिए, निम्न में से एक सत्य है:

    • एम एक फोन, निर्माण या सूचकांक हस्ताक्षर और एस एक फोन शामिल हैं, निर्माण या सूचकांक हस्ताक्षर एन जहां है

      • एम का परिणाम प्रकार शून्य है, या एन का परिणाम प्रकार एम की है कि आबंटित है

इस मामले में, हम परीक्षण कर रहे हैं, तो () => stringकरने के लिए आबंटित है () => void। तो या तो stringकरने के लिए आबंटित हो गया है void(यह नहीं है), या voidहो गया है void(यह है)।


वास्तव में, यहाँ नियम है आप वापसी मान फेंक करने की अनुमति है , जो कैसे जैसे सी ++ व्यवहार करता है के साथ संगत है voidटेम्पलेट संकल्प में।

function decrementWidgetHeight(w: Widget): number {
    // ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
    // for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

हम के प्रकार विवश जब changeहोने के लिए (widget) => void, हम इसे कर रहे हैं ताकि आप पास कर सकते हैं decrementWidgetHeightदूसरा तर्क हालांकि यह एक वापसी मान के रूप में, लेकिन अभी भी लगता है कि जब हम के शरीर बारे में बनाने applyToManyWidgets, हम किसी का उपयोग नहीं करते का मान changeकहीं भी।

ध्यान दें कि voidअभी भी तुलना में अलग है anyक्योंकि यह अनुचित है:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'
06/10/2012 को 22:06
का स्रोत उपयोगकर्ता

वोट
0

यह एक बग की तरह दिखता है। आप एक खोलना चाहिए नए काम आइटम जारी करने के लिए

06/10/2012 को 18:38
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more