2012-10-08 8 views
7

टाइपस्क्रिप्ट में एक विधि घोषणा में, पैरामीटर स्ट्रिंग्स, बूलियन, या संख्याओं के प्रकार सरणी का हो सकता है। क्या मुझे इसे किसी भी रूप में घोषित करना है [] या इन तीन प्रकारों के इनपुट प्रकार को सीमित करने का कोई तरीका है?क्या मैं पैरामीटर प्रकार को टाइपस्क्रिप्ट में किसी भी प्रकार के बजाय कई प्रकारों में से एक के रूप में निर्दिष्ट कर सकता हूं?

उत्तर

23

टाइपप्रति 1.4 शुरू की Union Types तो इस सवाल का जवाब अब हाँ, आप कर सकते हैं है।

function myFunc(param: string[] | boolean[] | number[]): void; 

निर्दिष्ट किए गए विकल्पों की तुलना में अन्य प्रकार का उपयोग करने से संकलन-समय त्रुटि उत्पन्न हो जाएगी।


आप एक से अधिक विशिष्ट प्रकार की एक सरणी चाहते हैं, आप संघ के प्रकार है कि के लिए भी उपयोग कर सकते हैं:

function myFunc(param: (string|boolean|number)[]): void; 

ध्यान दें कि यह क्या ओ पी के लिए कहा से अलग है। इन दो उदाहरणों के अलग-अलग अर्थ हैं।

+0

मेरे लिए, ऐसा लगता है कि यह एक सरणी हो सकती है जिसमें पूरी तरह से एक प्रकार का होता है, जहां वह प्रकार स्ट्रिंग, बूलियन या नंबर हो सकता है। एक सरणी के बारे में क्या है जिसमें केवल तीन प्रकार के मिश्रण हो सकते हैं? –

+0

मुझे यकीन नहीं है कि ओपी ने क्या पूछा है, लेकिन मैंने अपना जवाब वैसे भी संपादित किया है। आप स्पष्ट रूप से समझते हैं कि दोनों के बीच एक अंतर है। – Joao

1

आप समारोह का उपयोग कर सकते यह करने के लिए overloads:

class Thing { 
    public foo(x: number[]); 
    public foo(x: bool[]); 
    public foo(x: string[]); 
    public foo(x: any[]) { 
     // Note: You'll have to do type checking on 'x' manually 
     // here if you want differing behavior based on type 
    } 
} 

// Later... 
var t = new Thing(); 
t.foo(someArray); // Note: External callers will not see the any[] signature 
+0

फ़ंक्शन ओवरलोड सहायता कर सकते हैं। – Amr

0

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

+0

सुपर क्लास काम कर सकती है, एक इन-लाइन प्रकार जिसमें सामान्य तरीके और गुण होते हैं। – Amr

1

नहीं। टाइपस्क्रिप्ट पैरामीटर में केवल एक वैकल्पिक प्रकार एनीोटेशन का समर्थन करता है, उदा। x: string, संख्या या कोई भी, इसलिए आप अनुमत प्रकारों का एक सेट नहीं बता सकते हैं।

समारोह भार के मंगलाचरण के पैटर्न एक समारोह के द्वारा समर्थित की एक अधिक सटीक विनिर्देश की तुलना में एक भी हस्ताक्षर के साथ संभव है की अनुमति देते हैं:

हालांकि, टाइपप्रति समारोह भार के (प्रलेखन p51) का समर्थन करता है। [...]

function attr(name: string): string; 
    function attr(name: string, value: string): Accessor; 
    function attr(map: any): Accessor; 
    function attr(nameOrMap: any, value: string): any { 
     if (nameOrMap && typeof nameOrMap === "object") { 
      // handle map case 
     } 
     else { 
      // handle string case 
     } 
    } 

Otherwsie आप typeof प्रकार चेकों का उपयोग कर सकते हैं, लेकिन यह प्रकार स्क्रिप्ट एक छोटा सा के प्रकार ascpect काउंटरों।

function myFunc(x){ 
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number") 
     throw new TypeError("Unsupported type!"); 
} 
+0

मैं फ़ंक्शन ओवरलोड विचार से सहमत हूं लेकिन टाइपफ़ टाइप प्रकार इंटेलिजेंस में मदद नहीं करता है। मुझे लगता है कि मेरे प्रश्न का उत्तर नहीं है, लेकिन मेरे पास ऐसा उत्तर है जो वास्तव में मदद कर सकता है। मैं इसे पोस्ट करूंगा। – Amr

+0

टाइपस्क्रिप्ट 1.4 के साथ उत्तर ** हाँ ** है। मेरा जवाब जांचें। – Joao

0

इसका समाधान करने के लिए एक अन्य तरीका इनपुट प्रकार के बीच आम तरीकों और गुण को खोजने और विधि घोषणा कि इन आम methos और गुण रखती में एक इन-लाइन प्रकार की घोषणा करने के लिए है। इस तरह:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; }): methodResultType; 
6

इसमें कुछ समय पुराने सवाल लगता है, लेकिन वैसे भी, मैं इसे भर में आया था, और यह अन्य जवाब है कि मैं लाने याद किया।

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

class UtilsClass { 
    selectDom(element: string | HTMLElement):Array<HTMLElement> { 
     //Here will come the "magic-logic" 
    } 
} 

इसका कारण यह है "संघ-प्रकार" के नए टाइपप्रति अवधारणा के है।

आप और अधिक here देख सकते हैं।

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

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