2012-10-06 20 views
17

मैं समझने में सक्षम नहीं होने लगते हैं क्यों निम्नलिखित कोड त्रुटि उठाना नहीं करता है:टाइपस्क्रिप्ट: शून्य वापसी प्रकार किसी भी प्रकार में परिवर्तित?

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

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

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

को rg की परिभाषा बदल संकलक शिकायत करने के लिए शुरू होता है।

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

+0

मैं [एक मुद्दा दायर] है (http://typescript.codeplex.com/workitem/139)। –

उत्तर

17

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

A type S is assignable to a type T, and T is assignable from S, if one of the following is true...

  • S and T are object types and, for each member M in T, one of the following is true:

    • M is a call, construct or index signature and S contains a call, construct or index signature N where

      • the result type of M is Void, or the result type of N is assignable to that of M.

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


वास्तव में, नियम यहाँ है आप वापसी मान, जो कैसे उदा के साथ संगत है फेंक करने की अनुमति है सी ++ टेम्पलेट रिज़ॉल्यूशन में 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' 
+0

+1 - आप इसका उपयोग करके परीक्षण कर सकते हैं: 'var rg: {(): शून्य;} [] = []; rg.push (फ़ंक्शन(): स्ट्रिंग {रिटर्न "";}) var x = rg [0](); 'कार्रवाई में व्यवहार देखने के लिए टाइपस्क्रिप्ट प्लेग्राउंड में। 'शून्य' को 'स्ट्रिंग' में बदलें और यह रिटर्न मान का उपयोग करने की अनुमति देगा। – Fenton

+0

ठीक है, यह समझ में आता है, लेकिन थोड़ा सा अंतर्ज्ञानी है, यानी एक ऐसा फ़ंक्शन जोड़ने की इजाजत देता है जो प्रकार से मेल नहीं खाता है, भले ही यह परिभाषा में शून्य हो। –

+1

spec यह भी कहता है "शून्य केवल अपरिभाषित, शून्य और किसी भी प्रकार से संबंधित है", इसलिए मुझे यकीन नहीं है कि spec सुसंगत है। निश्चित रूप से अप्रत्याशित। संस्करण 1.4.1.0 के रूप में – Roly

0

यह एक बग की तरह दिखता है। आपको को

+0

[क्या वह] (https://typescript.codeplex.com/workitem/1734), लेकिन उपर्युक्त टिप्पणी दी गई मुझे लगता है कि यह इरादा है। जेएस में अब तक जेनिक्स का अधिक उपयोग नहीं है ... – Roly

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