इस डिजाइन के द्वारा होता है (मैं क्यों यह अच्छे डिजाइन शीघ्र ही है की व्याख्या करेंगे)। कल्पना का कहना है (खंड 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'