2012-10-04 19 views
38

मैं यह पता लगाने के लिए संघर्ष कर रहा हूं कि टाइपस्क्रिप्ट में एक स्थिर रूप से टाइप की गई सरणी घोषित करने के लिए यह संभव है या नहीं।कार्यों की एक टाइप की गई सरणी

उदाहरण के लिए, मैं यह कर सकता:

foo: (data:string) => void = function (data) {}; 

लेकिन अगर मैं foo कार्यों कि एक स्ट्रिंग लेने के लिए और वापस जाने के लिए कुछ भी नहीं की एक सरणी होना चाहता हूँ, मुझे लगता है कि कैसे करते हो? क्योंकि टाइपप्रति सोचता है कि यह एक समारोह है कि एक स्ट्रिंग लेता है और शून्य की एक सरणी देता है

foo: (data:string) => void [] = []; 

काम नहीं करता है, और यह मुझे कोष्ठक में समारोह रैप करने के लिए कोशिश कर रहा है की तरह प्रतीत नहीं होता है।

कोई विचार?

उत्तर:

foo: { (data: string): void; } [] 
+0

संभावित डुप्लिकेट [टाइपस्क्रिप्ट में मैं स्ट्रिंग स्वीकार करने और स्ट्रिंग को वापस करने वाले कार्यों की एक सरणी कैसे घोषित करूं?] (Http://stackoverflow.com/questions/12706161/in-typescript-how-do-i-declare -an-array-of-functions-that-accept-a-string-and-re) – Fenton

उत्तर

58

आप language spec खंड 3.5.5 में इस पा सकते हैं: नीचे मोहम्मद के लिए धन्यवाद, यहाँ एक उदाहरण है कि टाइपप्रति खेल का मैदान में काम करता है (नए, अधिक पठनीय) वसा तीरों का उपयोग करके कार्यों की एक सरणी टाइप करने के तरीके:

let foo: Array<(data: string) => void>; 
let bar: ((data: string) => void)[]; 
+0

खेल का मैदान इसके लिए दो त्रुटियां दिखा रहा है। – asawyer

+0

हाँ, ऐसा लगता है। धन्यवाद। –

+1

@asawyer इसे कक्षा या इंटरफ़ेस के अंदर होना चाहिए, और इसके अंत में अर्धविराम होना चाहिए। –

19

अन्य:

class whatever { 
public foo: { (data: string): void; }[] = []; 

    dofoo() { 
     for (var i=0; i < this.foo.length; i++) { 
      this.foo[i]("test"); 
     } 
    } 
} 

var d = new whatever(); 

d.foo.push(function(bar){alert(bar)}) 
d.foo.push(function(bar){alert(bar.length.toString())}) 

d.dofoo(); 
संबंधित मुद्दे